2

私は Go を楽しんでいる Python プログラマーです。私がよくつまずくのは、参照の使用です。私はそれを(ほとんど)マスターしましたが、時折、これのような何かが私を困惑させます.

私は単純なタイプ(「フィクスチャ」)を持っています:

type Fixture struct {
    Probabilities      *[]float64
}

このタイプの 1 つのインスタンスの確率フィールドを入力すると、すべて問題ありません。

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>

特に参照に関して、配列/スライスがどのように機能するかを理解していないと思います。誰かが私が間違っているところを指摘できますか?

ありがとう!

4

2 に答える 2

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]
于 2013-03-19T08:25:47.643 に答える
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]
于 2013-03-19T12:51:30.807 に答える