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

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

Mary-Kate Olsen
リリース: 2024-12-03 16:03:12
オリジナル
230 人が閲覧しました

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

Go のデフォルトの構造体値

Go では、int などのプリミティブ型にはデフォルト値があります。 int の場合、このデフォルト値は 0 です。ただし、手動で設定した値 0 とデフォルト値を区別するのは難しい場合があります。

次の構造体を考えてみましょう。

type test struct {
    testIntOne int
    testIntTwo int
}
ログイン後にコピー

If 1 つのフィールドが 0 に設定された構造体を作成しますが、もう 1 つのフィールドが設定されているか、デフォルトのままであるかはわかりません。 value:

package main

import "log"

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

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

解決策

ポインタの使用

解決策の 1 つは、フィールドにポインタを使用することです。ポインタの値はゼロの nil なので、フィールドが設定されているかどうかを確認できます。

type test struct {
    testIntOne *int
    testIntTwo *int
}

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

    log.Println(s.testIntOne != nil) // Output: true
    log.Println(s.testIntTwo != nil) // Output: false
}
ログイン後にコピー

メソッドの使用

別の解決策は、次のようなメソッドを作成することです。フィールドを設定し、設定されているかどうかを追跡します。直接アクセスを防ぐために、フィールド自体をアンエクスポートする必要があります:

type test struct {
    testIntOne int
    testIntTwo int

    oneSet, twoSet bool
}

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

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

    log.Println(s.oneSet) // Output: true
    log.Println(s.twoSet) // Output: false
}
ログイン後にコピー

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

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