我有一些TCP连接,它为我返回一些数据。我也有一个代表这些数据的结构。
type Item struct {
A int32
B int32
}
Item
支持Unpacker
界面
func (item *Item) Unpack(data []int32) {
item.A = data[0]
item.B = data[1]
return
}
type Unpacker interface {
Unpack([]int32)
}
所以我收到来自Network的一些数据代表了一堆项目。现在我想把我的结构传递给函数,我想要回到一个充满数据的结构:
func find(packet [][]int32, responseItem Unpacker) (items []Unpacker) {
items = make([]Unpacker, len(packet))
for i, data := range(packet) {
responseItem.Unpack(data)
items[i] = responseItem
}
return
}
当然,在这种情况下,我有一个包含许多相同项目的切片(指向同一项目的指针)。但我想得到不同的项目和
items[i] = *responseItem
在我的情况下不起作用。
以下是操场的链接:http://play.golang.org/p/RP4ryxoG2I
我相信我不明白Go是如何工作的(这是我第一次使用Go)。同样值得注意的是:如果有可能,我不想在这里使用反射。
答案 0 :(得分:1)
你已经倒退了。您想在循环中创建新的Item
,将其解压缩到项目中,然后分配到切片中。您可以通过find
接受返回Unpacker
的函数来完成此操作。
请参阅以下内容:http://play.golang.org/p/rFoa1eoh4A
您的find
功能:
type UnpackerMaker func() (Unpacker)
func find(packet [][]int32, makeUnpacker UnpackerMaker) (items []Unpacker) {
items = make([]Unpacker, len(packet))
for i, data := range(packet) {
unpacker := makeUnpacker()
unpacker.Unpack(data)
items[i] = unpacker
}
return
}