2016-11-15 63 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

毫無疑問,我有很多的閱讀要做。希望我能在此期間練習一些。我的思考過程是,如果我可以使用正確的名稱初始化結構,那麼「名稱」字段將是不必要的。謝謝 –