有什么办法可以创建一个映射到多个结构中,然后使用它吗?我有几个不同的结构,它们实现相同的接口并为每个结构匹配输入类型。我想从不同的输入中读取数据到结构中——在编译时不知道输入类型。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如果您有两种以上的类型:如果一个或制作一个微型注册表(反映),请改用开关。
- 1 回答
- 0 关注
- 99 浏览
添加回答
举报
0/150
提交
取消