dongmu5596 2013-03-19 07:54
浏览 38
已采纳

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

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!

  • 写回答

2条回答 默认 最新

  • doujiao1538 2013-03-19 08:25
    关注

    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]
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 求解vmware的网络模式问题
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?