我看到该范围返回密钥和" copy"的价值。该范围是否有办法返回该项目的地址?实施例
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for _, e := range array {
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
http://play.golang.org/p/AFOGG9NGpx
这里"字段"未修改,因为范围发送字段的副本, 我是否必须使用索引或是否有其他方法来修改值?
感谢阅读。
答案 0 :(得分:81)
简短&直接回答:不,使用数组索引而不是值
所以上面的代码变成了:
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for idx, _ := range array {
array[idx].field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
答案 1 :(得分:2)
合并@Dave C和@Sam Toliman的评论
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for idx := range array {
e := &array[idx]
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
答案 2 :(得分:0)
已经在评论中说过了,但是对于那些立即寻找答案的人来说,这是通过使用一片指针并通过对原始代码进行最少更改来实现预期结果的方法。
package main
import "fmt"
type MyType struct {
field string
}
func main() {
// Slice of pointers instead of slice of type
var array [10]*MyType
// Initialize array manually
for idx := range array {
array[idx] = &MyType{}
}
for _, e := range array {
e.field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}
这里是playground
答案 3 :(得分:0)
Go 的 &range
只支持按值赋值。没有for i := range array {
e := &array[i]
e.field = "foo"
}
,因为它解决的问题太琐碎。
可以达到如下效果:
awk
答案 4 :(得分:-1)
package main
import "fmt"
type MyType struct {
field string
}
func main() {
var array [10]MyType
for index := range array {
array[index].field = "foo"
}
for _, e := range array {
fmt.Println(e.field)
fmt.Println("--")
}
}