猿问

如何在json的接口中存储不同的结构

http://play.golang.org/p/JJnU5ag234


我只能让 vA 直接工作,如果我想根据我期望的 json 使用我的 vI 在其中存储 A 或 B,我得到


json:无法将对象解组为 main.TA 类型的 Go 值


package main


import (

    "encoding/json"

    "fmt"

    "strings"

)


type T interface {

    Printer()

}


type A struct{ JA string }


func (t A) Printer() { fmt.Print("A") }


type B struct{ JB string }


func (t B) Printer() { fmt.Print("B") }


var vA []A

var vB []B

var vI []T


func main() {

    // vA = []A{A{}}

    // vI = []T{B{}}

    vI = []T{A{}}

    get()

}


func get() {


    dec := json.NewDecoder(strings.NewReader("[{\"JA\":\"OK\"}]"))

    if err := dec.Decode(&vI); err != nil {

        fmt.Print(err)

    }


    for _, v := range vI {

        v.Printer()

    }


}


温温酱
浏览 149回答 1
1回答

波斯汪

由于您希望解码器填充结构的字段,因此您必须使用指针。像这样在类型的指针上定义接口的方法:http : //play.golang.org/p/WUMt9Ok9Xppackage mainimport (    "encoding/json"    "fmt"    "strings")type T interface {    Printer()}type A struct {    JA string}func (a *A) Printer() {    fmt.Printf("A: %v\n", a.JA)}type B struct {    JB string}func (b *B) Printer() {    fmt.Printf("B: %v\n", b.JB)}func main() {    vI := []T{&A{}, &B{}}    dec := json.NewDecoder(strings.NewReader("[{\"JA\":\"OKA\"}, {\"JB\":\"OKB\"}]"))    if err := dec.Decode(&vI); err != nil {        fmt.Print(err)    }    for _, v := range vI {        v.Printer()    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答