Goの割り当てで型として使用できません質問する

Goの割り当てで型として使用できません質問する

コードをコンパイルすると、次のエラー メッセージが表示されますが、なぜ発生するのかわかりません。原因を突き止める手助けをしてくれる人はいますか? よろしくお願いします。

割り当てで px.InitializePaxosInstance(val) (型 PaxosInstance) を型 *PaxosInstance として使用することはできません

type Paxos struct {
    instance   map[int]*PaxosInstance
}    

type PaxosInstance struct {
    value        interface{}
    decided      bool
}    

func (px *Paxos) InitializePaxosInstance(val interface{}) PaxosInstance {
    return PaxosInstance {decided:false, value: val}
}

func (px *Paxos) PartAProcess(seq int, val interface{}) error {  
    px.instance[seq] = px.InitializePaxosInstance(val)
    return nil 
}

ベストアンサー1

マップはPaxosInstance( *PaxosInstance) へのポインターを期待していますが、構造体の値を渡しています。Initialize 関数を変更してポインターを返します。

func (px *Paxos) InitializePaxosInstance(val interface{}) *PaxosInstance {
    return &PaxosInstance {decided:false, value: val}
}

これでポインタが返されます。 を使用して変数のポインタを取得できます。&構造体の値自体が必要な場合は、 を使用して再度逆参照します*

次のような行の後

x := &PaxosInstance{} 

または

p := PaxosInstance{}
x := &p

の値の型はxです*PaxosInstance。必要であれば、次のようPaxosInstanceに構造体の値に逆参照することができます。

p = *x

通常、構造体を実際の値として渡すことは望ましくありません。Go は値渡しであり、全体をコピーするからです。マップやスライスで構造体の値を使用すると、反復処理したりインデックス以外で参照したりするとコピーが作成されるため、論理エラーが発生することがよくあります。使用ケースによって異なりますが、識別子から、Instance重複やそのような論理エラーを回避する必要があることがわかります。

コンパイラ エラーを読むと、何を伝えているのかがわかります。型PaxosInstanceと型は*PaxosInstance同じではありません。

おすすめ記事