2016-11-15 61 views
0

我想从字符串列表初始化结构体,但编译器抛出以下错误。我仍然在学习语言,所以请原谅我的无知,但这是通过使用类型断言来解决的吗?从字符串列表中初始化结构体

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

回答

2

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片:

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先学习基础知识。

+0

毫无疑问,我有很多的阅读要做。希望我能在此期间练习一些。我的思考过程是,如果我可以使用正确的名称初始化结构,那么“名称”字段将是不必要的。谢谢 –