1 回答

TA貢獻1820條經驗 獲得超3個贊
要了解幕后發生的事情,您必須了解for rangego 中構造的指針和值語義。
這篇ardan labs文章中清楚地解釋了這一點
emails := []string{"a", "b"}
CCEmails := []*string{}
for _, cc := range emails {
p := &cc
fmt.Println(cc, p)
CCEmails = append(CCEmails,&cc)
}
上面的代碼遵循值語義。它復制原始切片并迭代切片內的值。在迭代時,它會復制指針處特定索引處的值。Atlast,指針指向迭代完成后的最后一個元素。
要獲得所需的行為,請使用指針語義 -
emails := []string{"a", "b"}
CCEmails := []*string{}
for i := range emails {
CCEmails = append(CCEmails,&emails[i])
}
fmt.Println(CCEmails)
for i := range CCEmails {
fmt.Println(CCEmails[i], *CCEmails[i])
}
上面的代碼遵循指針語義。它在原始數組上循環并將特定元素的地址附加到地址片中。
- 1 回答
- 0 關注
- 209 瀏覽
添加回答
舉報