構造体型の埋め込みフィールド アクセス
Go では、構造体は他の構造体をフィールドとして埋め込むことができます。これにより、複雑なデータ構造の構成が可能になります。ただし、ポインタを使用する場合、埋め込みフィールド値へのアクセスは混乱する可能性があります。
例と問題
次の構造体の定義を考えてみましょう。
<code class="go">type Engine struct { power int } type Tires struct { number int } type Cars struct { *Engine Tires } </code>
In Cars 構造体には、Engine 構造体 (*Engine) への埋め込みポインターが定義されています。次のように Cars のインスタンスが作成されると:
<code class="go">func main() { car := new(Cars) car.number = 4 car.power = 342 fmt.Println(car) } </code>
プログラムは次のエラーでパニックになります:
panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x0 pc=0x23bb]
Solution
To埋め込みフィールド値にアクセスするには、明示的なフィールド名か、埋め込みポインタを介した間接指定が必要です。間接的にパワー フィールドにアクセスする例を次に示します。
<code class="go">package main import "fmt" type Engine struct { power int } type Tires struct { number int } type Cars struct { *Engine 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>
このコードは、Cars インスタンスを正常に初期化し、埋め込みフィールドに値を割り当て、期待される出力を出力します。
&{0x10328100 {4}} &{342} 342 {4} 4
以上がポインターを使用して Go 構造体の埋め込みフィールドにアクセスするときに実行時エラーを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。