复制界面隐藏的数据

时间:2013-06-14 18:55:33

标签: interface go

我有一些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)。同样值得注意的是:如果有可能,我不想在这里使用反射。

1 个答案:

答案 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
}