我正在尝试从字符串列表中初始化结构,但编译器抛出以下错误。我仍在学习这门语言,请原谅我的无知,但这是否可以通过使用类型断言来解决?
ERROR: v.UberX undefined (type string has no field method UberX)
type Galaxy struct {
UberX int64
UberY int64
}
func main() {
galaxies := []string{"andromeda", "milkyway", "maffei"}
for _, v := range galaxies {
v := &Galaxy{}
}
for _, v := range galaxies {
v.UberX += 1000
v.UberY += 750
}
}
最佳答案
您的 Galaxy
结构甚至不存储名称,在您的尝试中,名称和结构值之间没有任何联系。将名称添加到结构中:
type Galaxy struct {
Name string
UberX int64
UberY int64
}
接下来,在您的第一个循环中,您创建了一个 *Galaxy
值,但您只将它存储在一个局部变量 v
中,顺便说一句,它隐藏了循环变量 v
:
for _, v := range galaxies {
v := &Galaxy{}
}
您需要一片 Galaxy
或一片可以填充的 *Galaxy
:
gs := make([]*Galaxy, len(galaxies))
然后 1 个循环足以遍历星系名称并填充 gs
slice :
for i, v := range galaxies {
gs[i] = &Galaxy{
Name: v,
UberX: 1000,
UberY: 750,
}
}
验证结果:
for _, v := range gs {
fmt.Printf("%+v\n", v)
}
输出(在 Go Playground 上尝试):
&{Name:andromeda UberX:1000 UberY:750}
&{Name:milkyway UberX:1000 UberY:750}
&{Name:maffei UberX:1000 UberY:750}
推荐通过Golang Tour首先学习基础知识。
关于go - 从字符串列表初始化结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40607811/