我原本希望这段代码可以运行:
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,或者它们只是完全错误。 :/
答案 0 :(得分:4)
切片不仅仅是指向数组的指针,它还有一个包含其长度和容量的内部表示。
如果您想从list
获得切片,您可以这样做:
_ = Blah {
Values : list[:],
}
答案 1 :(得分:3)
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,
}
}