你怎么在Go中有一个带有指向数组的指针的结构?

时间:2013-02-11 04:24:36

标签: go

我原本希望这段代码可以运行:

package main

type Item struct {
  Key string
  Value string
}

type Blah struct {
  Values []Item
}

func main() {
  var list = [...]Item {
    Item {
      Key : "Hello1",
      Value : "World1",
    },
    Item {
      Key : "Hello1",
      Value : "World1",
    },
  }

  _ = Blah {
    Values : &list,
  }
}

我认为这是正确的做法;值是一个切片,列表是一个数组。 & list应该是一个切片,可以分配给Item [],对吗?

...但是,它错误地显示了消息:

cannot use &list (type *[2]Item) as type []Item in assignment

在C中,你会写:

struct Item {
  char *key;
  char *value;
};

struct Blah {
   struct Item *values;
};

你如何在Go中做到这一点?

我看到了这个问题: Using a pointer to array

...但是答案是针对之前版本的Go,或者它们只是完全错误。 :/

3 个答案:

答案 0 :(得分:4)

切片不仅仅是指向数组的指针,它还有一个包含其长度和容量的内部表示。

如果您想从list获得切片,您可以这样做:

_ = Blah {
    Values : list[:],
}

答案 1 :(得分:3)

幸运的是,Go并不像OP看起来那么冗长。这有效:

package main

type Item struct {
        Key, Value string
}

type Blah struct {
        Values []Item
}

func main() {
        list := []Item{
                {"Hello1", "World1"},
                {"Hello2", "World2"},
        }

        _ = Blah{list[:]}
}

(还here

PS:我建议不要在Go中写C。

答案 2 :(得分:2)

当你开始使用Go完全忽略数组时,只需使用切片是我的建议。数组很少使用,导致Go初学者遇到很多麻烦。如果你有一个切片,那么你不需要指向它的指针,因为它是一个引用类型。

Here is your example带有一个切片而且没有指针更加惯用。

package main

type Item struct {
    Key   string
    Value string
}

type Blah struct {
    Values []Item
}

func main() {
    var list = []Item{
        Item{
            Key:   "Hello1",
            Value: "World1",
        },
        Item{
            Key:   "Hello1",
            Value: "World1",
        },
    }

    _ = Blah{
        Values: list,
    }
}