我是 Golang 的新手,遇到了以下問題。// XXX a bit inefficient. could open r files and run over list oncefor r := 0; r < nreduce; r++ { file, err = os.Create(ReduceName(fileName, JobNumber, r)) if err != nil { log.Fatal("DoMap: create ", err) } enc := json.NewEncoder(file) for e := res.Front(); e != nil; e = e.Next() { kv := e.Value.(KeyValue) if ihash(kv.Key)%uint32(nreduce) == uint32(r) { err := enc.Encode(&kv) if err != nil { log.Fatal("DoMap: marshall ", err) } } } file.Close()}基本上,這段代碼片段在每個 for 循環(huán)迭代中創(chuàng)建一個文件,然后根據(鍵,值)對打開一個文件以對屬于該文件的內容進行編碼。然而,這段代碼效率低下,因為它掃描了這個文件太多次。更有效的方法是打開 r 文件并運行此列表文件一次。所以我想這樣寫(但我不知道怎么寫):enc_map := make(map[int]*Encode)for r := 0; r < nreduce; r++ {file. err = os.Create(ReduceName(fileName, JobNumber, r))if err != nil { log.Fatal("DoMap: create ", err)}enc := json.NewEncoder(file)enc_map[r] = encfor e := res.Front(); e != nil; e = e.Next() { kv := e.Value.(KeyValue) r := ihash(kv.Key)&uint32(nreduce) err := enc_map[r].Encode(&kv) if err != nil { log.Fatal("DoMap: marshall ", err) }}此代碼片段首先創(chuàng)建一個保存 json.Encoder 對象的映射,然后遍歷此文件一次。我查看了 go 文檔,它說 json.Encoder 的類型名稱是 *Encode。但是線enc_map := make(map[int]*Encode)是錯誤的,編譯器給了我以下錯誤:../mapreduce/mapreduce.go:228: undefined: Encode../mapreduce/mapreduce.go:230: file.err undefined (type *os.File has no field or method err)../mapreduce/mapreduce.go:230: multiple-value os.Create() in single-value context那么做事的正確方法是什么?
1 回答

臨摹微笑
TA貢獻1982條經驗 獲得超2個贊
json.NewEncoder(file)
返回一個類型的對象*Encoder
。因此,嘗試編輯該行:
enc_map := make(map[int]*Encode)
到:
enc_map := make(map[int]* json.Encoder)
消除錯誤:
../mapreduce/mapreduce.go:228: undefined: Encode
為了擺脫其他 2 個錯誤,即,
../mapreduce/mapreduce.go:230: file.err undefined (type *os.File has no field or method err) ../mapreduce/mapreduce.go:230: multiple-value os.Create() in single-value context
只需在線編輯file .err
:
file. err = os.Create(ReduceName(fileName, JobNumber, r))
要file, err
在你的代碼。
我希望這可以解決您面臨的問題。
- 1 回答
- 0 關注
- 330 瀏覽
添加回答
舉報
0/150
提交
取消