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