英文:
Golang reference to slice field in array of types
问题
我是一个喜欢Go的Python程序员。有一件经常困扰我的事情是引用的使用;我已经掌握了它(大部分),但有时候还是会遇到一些困惑,比如这个问题。
我有一个简单的类型('Fixture'):
type Fixture struct {
Probabilities *[]float64
}
如果我为这个类型的单个实例填充Probabilities字段,一切都很好:
c := appengine.NewContext(r)
f := Fixture{}
p := []float64{}
p = append(p, 0.5)
p = append(p, 0.2)
p = append(p, 0.3)
f.Probabilities = &p
c.Infof("%v", *f.Probabilities)
2013/03/19 07:37:36 INFO: [0.5 0.2 0.3]
然而,如果我尝试为这些类型的数组填充这个字段,代码可以编译,但字段的值始终为nil:
c := appengine.NewContext(r)
fixtures := []Fixture{}
f := Fixture{}
fixtures = append(fixtures, f)
for _, f := range fixtures {
p := []float64{}
p = append(p, 0.5)
p = append(p, 0.2)
p = append(p, 0.3)
f.Probabilities = &p
}
for _, f := range fixtures {
// c.Infof("%v", *f.Probabilities) // causes error
c.Infof("%v", f.Probabilities)
}
2013/03/19 07:37:41 INFO: <nil>
我猜我不理解数组/切片的工作原理,特别是关于引用的部分。有人能指出我哪里错了吗?
谢谢!
英文:
I'm a Python programmer enjoying Go. The thing that trips me up must often is the use of references; I have mastered it (mostly) but then on occasion something baffles me, such as this one.
I have a simple type ('Fixture'):
type Fixture struct {
Probabilities *[]float64
}
If I populate the Probabilities field for a single instance of this type, everything is fine:
c := appengine.NewContext(r)
f := Fixture{}
p := []float64{}
p = append(p, 0.5)
p = append(p, 0.2)
p = append(p, 0.3)
f.Probabilities = &p
c.Infof("%v", *f.Probabilities)
2013/03/19 07:37:36 INFO: [0.5 0.2 0.3]
However if I try and populate this field for an array of these types, the code compiles but the field value is always nil:
c := appengine.NewContext(r)
fixtures := []Fixture{}
f := Fixture{}
fixtures = append(fixtures, f)
for _, f := range fixtures {
p := []float64{}
p = append(p, 0.5)
p = append(p, 0.2)
p = append(p, 0.3)
f.Probabilities = &p
}
for _, f := range fixtures {
// c.Infof("%v", *f.Probabilities) // causes error
c.Infof("%v", f.Probabilities)
}
2013/03/19 07:37:41 INFO: <nil>
I guess I'm not understanding how arrays/slices work, particularly with respect to references. Can anyone point out where I'm going wrong ?
Thanks!
答案1
得分: 5
在范围语句中
for _, f := range fixtures { ... }
f
是一个新声明的本地变量,类型为 Fixture
。它不是对任何东西的_引用_。因此,在设置其值之后,它必须放入 fixtures
切片中。
package main
import "fmt"
type Fixture struct {
Probabilities *[]float64
}
func main() {
fixtures := []Fixture{}
f := Fixture{}
fixtures = append(fixtures, f)
for i, f := range fixtures {
p := []float64{}
p = append(p, 0.5)
p = append(p, 0.2)
p = append(p, 0.3)
f.Probabilities = &p
fixtures[i] = f
}
for _, f := range fixtures {
fmt.Printf("%v", f.Probabilities)
}
}
(也可以在这里查看)
输出
&[0.5 0.2 0.3]
英文:
In the range statement
for _, f := range fixtures { ... }
f
is a newly declared local variable of type Fixture
. It's not a reference to anything. So after setting up its values, it has to be put into to the fixtures
slice.
package main
import "fmt"
type Fixture struct {
Probabilities *[]float64
}
func main() {
fixtures := []Fixture{}
f := Fixture{}
fixtures = append(fixtures, f)
for i, f := range fixtures {
p := []float64{}
p = append(p, 0.5)
p = append(p, 0.2)
p = append(p, 0.3)
f.Probabilities = &p
fixtures[i] = f
}
for _, f := range fixtures {
fmt.Printf("%v", f.Probabilities)
}
}
(Also here)
Output
&[0.5 0.2 0.3]
答案2
得分: 0
将元素值存储在切片中。例如,
package main
import "fmt"
type Fixture struct {
Probabilities *[]float64
}
func main() {
fixtures := make([]Fixture, 1)
for i := range fixtures {
p := []float64{0.5, 0.2, 0.3}
fixtures[i] = Fixture{Probabilities: &p}
}
for _, f := range fixtures {
fmt.Println(*f.Probabilities)
}
}
输出:
[0.5 0.2 0.3]
英文:
Store the element value in the slice. For example,
package main
import "fmt"
type Fixture struct {
Probabilities *[]float64
}
func main() {
fixtures := make([]Fixture, 1)
for i := range fixtures {
p := []float64{0.5, 0.2, 0.3}
fixtures[i] = Fixture{Probabilities: &p}
}
for _, f := range fixtures {
fmt.Println(*f.Probabilities)
}
}
Output:
[0.5 0.2 0.3]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论