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

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

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

Go
慕桂英4014372 2023-05-08 15:09:42
有什么办法可以创建一个映射到多个结构中,然后使用它吗?我有几个不同的结构,它们实现相同的接口并为每个结构匹配输入类型。我想从不同的输入中读取数据到结构中——在编译时不知道输入类型。type myInput struct {    InputType  string    data       []bytes}// Will get as an input after compeleationinputs := []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())}谢谢!
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

定义一个接口


type Bin interface {

    name() string

    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) {

    a.A = b[0]<<8 + b[1] // get that right, too lazy to code this for you

    a.B = b[2]<<24 + b[3]<<16 + ...  

}

// same for StructB

所以你的 StructA/B 现在是 Bins。


func makeBin(in myInput) Bin {

     var bin Bin

     if in.InputType == "a" {

         bin = &StructA{}

     } else {

         bin = &StructB{}

     }

     bin.set(in.data) // error handling?

     return bin

}

if如果您有两种以上的类型:如果一个或制作一个微型注册表(反映),请改用开关。


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

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