Golang 对类型数组中切片字段的引用

我是一名喜欢 Go 的 Python 程序员。经常让我绊倒的事情必须是引用的使用;我已经掌握了它(大部分),但有时有些东西让我感到困惑,比如这个。


我有一个简单的类型('Fixture'):


type Fixture struct {

    Probabilities      *[]float64

}

如果我为这种类型的单个实例填充概率字段,一切都很好:


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]

但是,如果我尝试为这些类型的数组填充此字段,则代码会编译但字段值始终为零:


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>

我想我不明白数组/切片是如何工作的,尤其是在引用方面。谁能指出我哪里出错了?


慕码人2483693
浏览 214回答 2
2回答

慕娘9325324

在范围声明中for _, f := range fixtures { ... }f是一个新声明的局部变量类型Fixture。它不是对任何东西的引用。所以在设置它的值之后,它必须被放入fixtures切片。package mainimport "fmt"type Fixture struct {&nbsp; &nbsp; &nbsp; &nbsp; Probabilities *[]float64}func main() {&nbsp; &nbsp; &nbsp; &nbsp; fixtures := []Fixture{}&nbsp; &nbsp; &nbsp; &nbsp; f := Fixture{}&nbsp; &nbsp; &nbsp; &nbsp; fixtures = append(fixtures, f)&nbsp; &nbsp; &nbsp; &nbsp; for i, f := range fixtures {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p := []float64{}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p = append(p, 0.5)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p = append(p, 0.2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p = append(p, 0.3)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.Probabilities = &p&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fixtures[i] = f&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; for _, f := range fixtures {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("%v", f.Probabilities)&nbsp; &nbsp; &nbsp; &nbsp; }}(也在这里)输出&[0.5 0.2 0.3]

慕运维8079593

将元素值存储在切片中。例如,package mainimport "fmt"type Fixture struct {&nbsp; &nbsp; Probabilities *[]float64}func main() {&nbsp; &nbsp; fixtures := make([]Fixture, 1)&nbsp; &nbsp; for i := range fixtures {&nbsp; &nbsp; &nbsp; &nbsp; p := []float64{0.5, 0.2, 0.3}&nbsp; &nbsp; &nbsp; &nbsp; fixtures[i] = Fixture{Probabilities: &p}&nbsp; &nbsp; }&nbsp; &nbsp; for _, f := range fixtures {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(*f.Probabilities)&nbsp; &nbsp; }}输出:[0.5 0.2 0.3]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go