2013-03-19 70 views
2

我是一名享受Go的Python程序员。绊倒我的东西往往是使用引用;我已经掌握了它(大部分),但偶尔会让我感到困惑,比如这个。Golang引用切片字段的数组类型

我有一个简单的类型(“夹具”):

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> 

我想我不理解阵列/切片是如何工作的,特别是关于参考。任何人都可以指出我要出错的地方吗?

谢谢!

+3

P.S.对于使用指向片的指针似乎没有意义。只需直接使用切片。 – newacct 2013-03-19 08:37:17

+1

1:您不必在此处使用指向片的指针。切片是对实际数组的引用。 2:你是真正的问题(正如jnml和PeterSo在这里写的),范围中的“f”是一个副本,并且不改变片元素。 3:为什么不创建一个新的'Fixture'的函数? – Mostafa 2013-03-19 14:34:47

回答

5

范围内声明

for _, f := range fixtures { ... } 

fFixture类型的新声明的局部变量。这不是一个参考任何东西。因此,在设置其值后,必须将其放入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) 
     } 
} 

(也here


输出

&[0.5 0.2 0.3] 
+0

或者,制作一片指针'[] * Fixture',以便范围将复制指针,但它仍指向原始片元素。 – 2013-03-19 11:15:38

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] 
相关问题