インターフェース変数の型の決定: ゴルディアンの結び目のスライス
Go プログラミングの領域では、インターフェースの型を操作すると、次のことが可能になります。{}不確実性のタッチを導入します。よく発生する困惑する質問の 1 つは、インターフェイス変数にスライスが含まれているかどうかを確認する方法です。
このジレンマを解決するには、提供されている関数を詳しく調べてみましょう。
func name(v interface{}) { if is_slice() { for _, i := range v { my_var := i.(MyInterface) ... do smth } } else { my_var := v.(MyInterface) ... do smth } }
問題の核心は、とらえどころのない is_slice メソッドにあります。 v が実際にスライスであるかどうかを識別するには、実行時にその基になる型を検査する方法が必要です。ここでリフレクションが登場します。
リフレクションの力: 本質を暴く
Go のリフレクションは、実行時に値を内省して操作する手段を提供します。これにより、インターフェイス変数の具体的な型を取得し、それが目的の型(この場合はスライス)と一致するかどうかを判断できます。
次のコード スニペットは、is_slice:
func IsSlice(v interface{}) bool { return reflect.TypeOf(v).Kind() == reflect.Slice }reflect.TypeOf(v) を呼び出すことで、v の具体的な型を抽出します。 次に、Kind() メソッドは型の種類を返します。これは、次のようないくつかの定数のいずれかになります。 スライス。したがって、この条件が true と評価される場合、v にスライス参照が含まれていると自信を持って結論付けることができます。is_slice メソッドでスライスの存在が確認された場合は、次のように反復を続行できます。
for _, i := range v { my_var := i.(MyInterface) ... do smth }あるいは、v がスライスでない場合は、else ブロックが実行され、値を個別に扱うことができます。要素:
my_var := v.(MyInterface) ... do smth
追加の考慮事項:
以上がGo で「interface{}」変数がスライスを保持しているかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。