在 map golang 中使用不同的结构作为值

有什么办法可以创建一个映射到多个结构中,然后使用它吗?


我有几个不同的结构,它们实现相同的接口并为每个结构匹配输入类型。


我想从不同的输入中读取数据到结构中——在编译时不知道输入类型。


type myInput struct {

    InputType  string

    data       []bytes

}


// Will get as an input after compeleation

inputs := []myInput{

    myInput{InputType: "a", data: []bytes{0x01, 0x02, 0x03}},

    myInput{InputType: "b", data: []bytes{0x01, 0x02}},

}


type StructA struct {

   A uint16

   B uint32

}


func (a StructA) name () {

    fmt.Printf("name is: %d %d", a.A, a.B)

}


type StructB struct {

   C uint32

}


func (b StructB) name () {

    fmt.Printf("name is: %d", b.C)

}


AorB map[string]<???> {

    "a": StructA,

    "b": StructB,

}

在这一点上,我不知道该怎么办。我需要通过输入类型获取正确的结构并使用初始化结构binary.Read。


for _, myInput := range (inputs) {

    // ???? :(

    myStruct := AtoB[myInput.InputType]{}

    reader :=bytes.NewReader(input1)

    err := binary.Read(reader, binary.BigEndian, &myStruct)

    fmt.Printf(myStruct.name())

}

谢谢!


慕桂英4014372
浏览 100回答 1
1回答

holdtom

定义一个接口type Bin interface {&nbsp; &nbsp; name() string&nbsp; &nbsp; set([]byte) // maybe returning error}你将Bin只处理 s 。type StructA struct { /* your code so far */ }type StructB struct { /* your code so far */ }func (a *StructA) set(b []byte) {&nbsp; &nbsp; a.A = b[0]<<8 + b[1] // get that right, too lazy to code this for you&nbsp; &nbsp; a.B = b[2]<<24 + b[3]<<16 + ...&nbsp;&nbsp;}// same for StructB所以你的 StructA/B 现在是 Bins。func makeBin(in myInput) Bin {&nbsp; &nbsp; &nbsp;var bin Bin&nbsp; &nbsp; &nbsp;if in.InputType == "a" {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bin = &StructA{}&nbsp; &nbsp; &nbsp;} else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bin = &StructB{}&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;bin.set(in.data) // error handling?&nbsp; &nbsp; &nbsp;return bin}if如果您有两种以上的类型:如果一个或制作一个微型注册表(反映),请改用开关。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go