我想遍歷一個結構切片,并通過將每個結構傳遞給一個函式來填充一個結構欄位(這是一個映射)。
我有以下結構
type thing struct {
topicThing map[string]int
}
我有以下功能
func main() {
ths := make([]thing, 0)
for i := 0; i < 10; i {
var th thing
ths = append(ths, th)
}
for _, th := range ths {
dothing(&th)
}
for _, th := range ths {
fmt.Println(th.topicThing)
}
}
func dothing(th *thing) {
tc := make(map[string]int)
tc["Hello"] = 1
tc["Bye"] = 2
th.topicThing = tc
}
主函式創建一個事物切片(稱為 ths),并通過迭代每個事物將它們傳遞給 dothing() 函式。在 dothing() 中,我創建了一個新地圖,用資料填充它,并將其分配給傳入的東西的屬性。但是,當我們在 main 函式中迭代 ths 以列印每個事物的 topicThing 時,地圖是空的。
由于 make() 在堆中創建物件,我希望即使在函式范圍之外也可以訪問它。誰能告訴我為什么會這樣?
PS如果我改變 dothing() 函式如下:
func dothing(th *thing) {
th.topicThing["Hello"] = 1
th.topicThing["Bye"] = 2
}
代碼按預期作業,這意味著在主函式中訪問時,地圖會填充資料。
uj5u.com熱心網友回復:
range復制您的物件。所以當你這樣做時,
for _, th := range ths {
dothing(&th)
}
你實際上是dothing在副本上。
例如,有了這個main:
func main() {
ths := make([]thing, 0)
for i := 0; i < 10; i {
var th thing
ths = append(ths, th)
}
for _, th := range ths {
dothing(&th)
fmt.Println(th.topicThing)
}
它將列印正確的東西,因為我們仍在處理副本。
為了不復制,請使用陣列索引:
for idx, _ := range ths {
dothing(&ths[idx])
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/419547.html
標籤:
