int
/ string
/ bool
/etc.. に格納されてinterface{}
いる値があり、それが初期化されていないかどうか、つまり次のいずれかの値を持っているかどうかを判断したい
0
""
false
- また
nil
これを確認するにはどうすればよいですか?
int
/ string
/ bool
/etc.. に格納されてinterface{}
いる値があり、それが初期化されていないかどうか、つまり次のいずれかの値を持っているかどうかを判断したい
0
""
false
nil
これを確認するにはどうすればよいですか?
私が理解していることから、あなたは次のようなものが欲しいです:
func IsZeroOfUnderlyingType(x interface{}) bool {
return x == reflect.Zero(reflect.TypeOf(x)).Interface()
}
インターフェイス と について話すときnil
、人々は常に 2 つの非常に異なる無関係なものと混同されます。
nil
を持たないインターフェース値であるインターフェース値。これは、インターフェイス タイプのゼロ値です。nil
インターフェース値 (つまり、基になる値を持つ) ですが、その基になる値は基になる型のゼロ値です。たとえば、基になる値はnil
マップ、nil
ポインター、または 0 の数値などです。2番目のことについて質問されていることは理解しています。
更新: を使用した上記のコードにより、比較==
できない型では機能しません。代わりに使用すると、すべてのタイプで機能すると思います。reflect.DeepEqual()
func IsZeroOfUnderlyingType(x interface{}) bool {
return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface())
}
typeのゼロ値* は、 orではなく、interface{}
onlyです。nil
0
""
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]