【发布时间】:2019-07-09 03:04:56
【问题描述】:
使用此代码:https://play.golang.org/p/tCm1W-K-6ob
此代码将打印:[c c c],但 [a b c] 除外。
type A struct {
a *string
}
func f() {
slist := []string{"a", "b", "c"}
list := make([]*A, len(slist))
for i, v := range slist {
item := &A{
a: &v,
}
list[i] = item
}
fmt.Printf("[%s %s %s]", *list[0].a, *list[1].a, *list[2].a)
}
func main() {
f()
}
为什么列表不是["a", "b", "c"]?范围或 &string 发生了什么变化?
【问题讨论】:
-
Golang 中的循环变量实际上是为循环的所有迭代共享的,类似于 JS,所以
i和v是整个循环的相同变量。因此,如果您想获取地址,则需要为 v 创建一个临时值。