埋め込み構造体フィールドへのアクセス
Go では、構造体に埋め込みフィールドを含めることができ、これにより、ある構造体が別の構造体のフィールドを再利用できます。ただし、これらの埋め込みフィールドにアクセスすると、混乱が生じる場合があります。
次のコードを考えてみましょう:
<code class="go">type Engine struct { power int } type Tires struct { number int } type Cars struct { *Engine // embedded pointer-to-struct field Tires } func main() { car := new(Cars) car.number = 4 car.power = 342 fmt.Println(car) }</code>
コンパイル時に、エラーが発生する可能性があります:
runtime error: invalid memory address or nil pointer dereference
埋め込みフィールドについて
埋め込み Engine 構造体の power フィールドにアクセスするには、 car.power を直接使用することはできません。埋め込みフィールドは、中間ポインターまたは値を介して間接的にアクセスされます。
解決策
エラーを解決する 1 つの方法は、新しいエンジンを Cars の埋め込みフィールドに割り当てることです。 struct:
<code class="go">package main import "fmt" type Engine struct { power int } type Tires struct { number int } type Cars struct { *Engine // embedded pointer-to-struct field Tires } func main() { car := new(Cars) car.Engine = new(Engine) car.power = 342 car.number = 4 fmt.Println(car) fmt.Println(car.Engine, car.power) fmt.Println(car.Tires, car.number) }</code>
Output
&{0x10328100 {4}} &{342} 342 {4} 4
この変更されたコードでは、car.Engine が有効な Engine 構造体を指すようになり、power フィールドにアクセスできるようになります。 .
注: リフレクションやその他の高度なテクニックを使用して埋め込みフィールドにアクセスすることもできますが、一般に上記のアプローチが最も簡単です。
以上がGo の埋め込み構造体フィールドがポインターである場合、どのようにしてそれにアクセスしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。