猿问

如何迭代解码器?

我来自 Python 背景,因此倾向于从迭代器的角度进行思考。在我看来range,Go中的关键字打算让我们以几乎相同的方式思考,所以我想在语义上做一些与 Go 中的 Python 代码等效的事情:


for obj in json_decoder:

    # business logic

这是 Go 中的激励案例;考虑以下函数:


func (c *GorpController) Create(dec *json.Decoder) {

    // business logic

}

我希望能够将其实现为:


for someValue := range dec {

    // business logic

}

是否有某种方式可以range与Decoder接口一起使用?将其包装在不同界面中的函数将是理想的,并且可以接受惯用模式。


谢谢!


largeQ
浏览 256回答 2
2回答

慕田峪4524236

不幸的是,您只能使用range“数组、切片、字符串或映射,或从通道读取”(参见有效 go)要在解码时迭代结构,文档建议执行以下操作:dec := json.NewDecoder(strings.NewReader(jsonStream))for {    var m Message    if err := dec.Decode(&m); err == io.EOF {        break    } else if err != nil {        log.Fatal(err)    }    fmt.Printf("%s: %s\n", m.Name, m.Text)}

慕慕森

Ajson.Decoder是一个结构体,在 Go 中,您只能迭代(使用range)字符串、切片/数组、映射和通道(https://golang.org/ref/spec#For_statements)。但是,您可以循环遍历所有 JSON 编码的值io.Reader:func main() {    s := `"a string"72["an", "array"]{"an": "object"}`    dec := json.NewDecoder(strings.NewReader(s))    for {        var v interface{}        if err := dec.Decode(&v); err != nil {            if err == io.EOF {                break            }            log.Fatal(err)        }        log.Print(v)    }}http://play.golang.org/p/flqXlcx_6B编辑:虽然More似乎对本例中的值有效,但这不是它的预期用途(基于 godoc),因此检查 err == io.EOF 会更好。更新了代码片段。
随时随地看视频慕课网APP

相关分类

Go
我要回答