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

DDD
リリース: 2024-10-30 04:23:02
オリジナル
932 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!