ホームページ >バックエンド開発 >Golang >ポインターを使用して Go 構造体の埋め込みフィールドにアクセスするときに実行時エラーを回避するにはどうすればよいですか?

ポインターを使用して Go 構造体の埋め込みフィールドにアクセスするときに実行時エラーを回避するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-30 04:23:02997ブラウズ

How to Avoid Runtime Errors When Accessing Embedded Fields in Go Structs with Pointers?

構造体型の埋め込みフィールド アクセス

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。