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

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

DDD
リリース: 2024-12-04 17:20:15
オリジナル
932 人が閲覧しました

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

Go のデフォルト値と初期化されていないフィールドの区別

Go では、プリミティブ型にはデフォルト値があります。たとえば、整数 (int) は 0 に初期化されます。ただし、構造体を操作する場合、値 0 と初期化されていないフィールドを区別するのは難しい場合があります。

たとえば、以下のコードを考えてみましょう。

package main

import "log"

type test struct {
    testIntOne int
    testIntTwo int
}

func main() {
    s := test{testIntOne: 0}

    log.Println(s)
}
ログイン後にコピー

このコードでは、testIntOne と testIntTwo は両方とも 0 です。ただし、testIntOne は明示的に 0 に設定されており、testIntTwo はデフォルト値で初期化されています。このあいまいさは、どのフィールドが明示的に設定されているかを判断する際に混乱を招く可能性があります。

これら 2 つのケースを区別することは可能ですか?

いいえ、Go はどちらかを追跡しません。フィールドが設定されているかどうか。したがって、ゼロ値が初期化の結果であるか意図的な割り当てであるかを知ることは不可能です。

回避策

  • ポインターを使用する: ポインターには nil ゼロの値があるため、ポインターが設定されているかどうかを調べることで確認できます。 nil.
type test struct {
    testIntOne *int
    testIntTwo *int
}
ログイン後にコピー
  • Setter メソッドの作成: フィールドの値を設定し、それが設定されているかどうかを追跡するメソッドを作成できます。
type test struct {
    testIntOne int
    testIntTwo bool // Tracks if testIntTwo has been set
}

func (t *test) SetTestIntTwo(val int) {
    t.testIntTwo = val
    t.isSetTestIntTwo = true
}

func main() {
    s := test{}
    s.SetTestIntTwo(0)
    fmt.Println(s.isSetTestIntTwo) // Output: true
}
ログイン後にコピー

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート