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

如何迭代解码器?

如何迭代解码器?

Go
largeQ 2021-11-22 15:23:59
我来自 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接口一起使用?将其包装在不同界面中的函数将是理想的,并且可以接受惯用模式。谢谢!

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

不幸的是,您只能使用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)

}


查看完整回答
反对 回复 2021-11-22
?
慕慕森

TA贡献1856条经验 获得超17个赞

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 会更好。更新了代码片段。


查看完整回答
反对 回复 2021-11-22

没有找到匹配的内容?试试慕课网站内搜索吧

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号