0

我有一些 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)
}

所以我从网络收到了一些代表一堆项目的数据。现在我想将我的结构传递给函数,我想取回一片充满数据的结构:

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)。还需要注意:如果可能的话,我不想在这里使用反射。

4

1 回答 1

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
}
于 2013-06-14T19:11:58.317 回答