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

huangapple go评论72阅读模式
英文:

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 = &amp;p
c.Infof(&quot;%v&quot;, *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 = &amp;p
}
for _, f := range fixtures {
    // c.Infof(&quot;%v&quot;, *f.Probabilities) // causes error
    c.Infof(&quot;%v&quot;, f.Probabilities)
}

2013/03/19 07:37:41 INFO: &lt;nil&gt;

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 &quot;fmt&quot;

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 = &amp;p
                fixtures[i] = f
        }
        for _, f := range fixtures {
                fmt.Printf(&quot;%v&quot;, f.Probabilities)
        }
}

(Also here)


Output

&amp;[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 &quot;fmt&quot;

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: &amp;p}
	}
	for _, f := range fixtures {
		fmt.Println(*f.Probabilities)
	}
}

Output:

[0.5 0.2 0.3]

huangapple
  • 本文由 发表于 2013年3月19日 15:54:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/15494126.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定