2016-03-29 14 views
1

スライスを持つ構造体に関数を作りたいと思います。 私の問題は:私は私の構造体の内容を変更する必要があるため、ポインタの引数を使用したいと思います。ここでインターフェイススライスとポインタを移動

が私のコードです:

type CampaignIndexMemory []CampaignIndex 

type CampaignIndex struct { 
    Objects []CampaignIndexObject 
} 

type CampaignIndexObject struct { 
    //They don't really care about us 
} 

func (c *CampaignIndexMemory) setCampaignIndex(object CampaignIndex) { 

    valueSet := false 
    for i,_ := range c { 
     if c[i].Objects[0].ID == object.Objects[0].ID { 
      c[i] = object 
      valueSet = false 
      break 
     } 
    } 
    if valueSet { 
     c = append(c, object) 
    } 
} 

私が間違って進むのので、多分私の方法(私は深くごめんなさい)Javaの世界から来たんです。

このコードでは、コンパイルに間違いがあり、「オブジェクト」属性の「未解決の参照」と表示されます。

私の質問は簡単です:何が起こっているのですか?

あなたのお時間をありがとうございます。

+0

_ "スライスを持つ構造体に関数を作りたい" _受信者が 'struct'ではない、' CampaignIndexMemory'、つまり 'CampaignIndex'のスライスへのポインタです。 – Michael

+0

私は自分の型をstructに変換しただけで、うまく動作します。ありがとう。 これは私の新しいコードです: タイプCampaignIndexMemory struct {indexes [] CampaignIndex} そして私はすべてのc [i]をc.indexes [i] –

答えて

0

メソッドはタイプによって定義されています。 CampaignIndexMemorystructではなく、typeです。タイプは "slice of CampaignIndex"です。

documentation about slicesから

スライスは、基礎となる配列への参照を保持し、あなたが別の スライスを割り当てた場合、両方とも同じ配列を参照してください。関数が スライス引数をとる場合、そのスライスの要素に対する変更は、 の配列にポインタを渡すのと同様に、呼び出し元に表示される になります。 sliceではなく、スライスへのポインタである可能性がありsetCampaignIndex方法のために、あなたの受信機を意味

。変更は発信者に適用されます。私は、スライスヘッダがObjectフィールドが含まれていないので、あなたが得たエラーがあると思いslice headerにスライスポイントへ

func (c CampaignIndexMemory) setCampaignIndex(object CampaignIndex) { 

ポインタ。

関連する問題