36

int/ string/ bool/etc.. に格納されてinterface{}いる値があり、それが初期化されていないかどうか、つまり次のいずれかの値を持っているかどうかを判断したい

  • 0
  • ""
  • false
  • またnil

これを確認するにはどうすればよいですか?

4

4 に答える 4

76

私が理解していることから、あなたは次のようなものが欲しいです:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return x == reflect.Zero(reflect.TypeOf(x)).Interface()
}

インターフェイス と について話すときnil、人々は常に 2 つの非常に異なる無関係なものと混同されます。

  1. 基になる値nilを持たないインターフェース値であるインターフェース値。これは、インターフェイス タイプのゼロ値です。
  2. nilインターフェース値 (つまり、基になる値を持つ) ですが、その基になる値は基になる型のゼロ値です。たとえば、基になる値はnilマップ、nilポインター、または 0 の数値などです。

2番目のことについて質問されていることは理解しています。


更新: を使用した上記のコードにより、比較==できない型では機能しません。代わりに使用すると、すべてのタイプで機能すると思います。reflect.DeepEqual()

func IsZeroOfUnderlyingType(x interface{}) bool {
    return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface())
}
于 2012-12-16T22:18:47.210 に答える
4

typeのゼロ値* は、 orではなく、interface{}onlyです。nil0""false

package main

import "fmt"

func main() {
        var v interface{}
        fmt.Println(v == nil, v == 0, v == "", v == false)
}

(またhttp://play.golang.org/p/z1KbX1fOgB )


出力

true false false false

*: [Q]宣言または make または new の呼び出しによって値を格納するためにメモリが割り当てられ、明示的な初期化が提供されていない場合、メモリにはデフォルトの初期化が与えられます。このような値の各要素は、その型のゼロ値に設定されます。ブール値の場合は false、整数の場合は 0、浮動小数点数の場合は 0.0、文字列の場合は ""、ポインター、関数、インターフェイス、スライス、チャネル、およびマップの場合は nil です。[ /Q]

于 2012-12-16T13:45:26.037 に答える