ホームページ >バックエンド開発 >Golang >Go 構造体でデフォルトのゼロ値と明示的に設定されたゼロ値を区別するにはどうすればよいですか?

Go 構造体でデフォルトのゼロ値と明示的に設定されたゼロ値を区別するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-04 09:36:11630ブラウズ

How Can I Distinguish Between Default and Explicitly Set Zero Values in Go Structs?

構造体のデフォルト値

Go では、構造体の宣言時に初期化されない構造体のフィールドにデフォルト値が割り当てられます。 int のようなプリミティブ型の場合、このデフォルト値は 0 です。ただし、この値が明示的に設定されているか、デフォルト値であるかを判断するのは問題になる可能性があります。

違いはありますか?

残念ながら、Go はフィールドが設定されているかどうかを追跡しません。したがって、0 に初期化されたフィールドとまったく設定されていないフィールドを区別する方法はありません。

回避策

1.ポインタの使用:

ポインタを使用すると、ポインタの nil ゼロ値を利用できます。ポインタが nil の場合、それが設定されていないことを示します。

type test struct {
    testIntOne *int
    testIntTwo *int
}

func main() {
    s := test{testIntOne: new(int)}

    fmt.Println("testIntOne set:", s.testIntOne != nil)
    fmt.Println("testIntTwo set:", s.testIntTwo != nil)
}

2.メソッドの使用:

フィールドを設定し、設定されたかどうかを追跡するメソッドを定義することもできます。

type test struct {
    testIntOne int
    testIntTwo int

    oneSet, twoSet bool
}

func (t *test) SetOne(i int) {
    t.testIntOne, t.oneSet = i, true
}

func (t *test) SetTwo(i int) {
    t.testIntTwo, t.twoSet = i, true
}

func main() {
    s := test{}
    s.SetOne(0)

    fmt.Println("testIntOne set:", s.oneSet)
    fmt.Println("testIntTwo set:", s.twoSet)
}

以上がGo 構造体でデフォルトのゼロ値と明示的に設定されたゼロ値を区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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