为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中新建一个 json 编码器类型的数组或映射

在 Golang 中新建一个 json 编码器类型的数组或映射

Go
元芳怎么了 2021-11-29 19:30:43
我是 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 循环迭代中创建一个文件,然后根据(键,值)对打开一个文件以对属于该文件的内容进行编码。然而,这段代码效率低下,因为它扫描了这个文件太多次。更有效的方法是打开 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)    }}此代码片段首先创建一个保存 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在你的代码。

我希望这可以解决您面临的问题。


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 280 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信