ホームページ  >  記事  >  バックエンド開発  >  Go の埋め込み構造体フィールドがポインターである場合、どのようにしてそれにアクセスしますか?

Go の埋め込み構造体フィールドがポインターである場合、どのようにしてそれにアクセスしますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 21:55:02329ブラウズ

How Do You Access Embedded Struct Fields in Go When They Are Pointers?

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

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

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