Go で「interface{}」変数がスライスを保持しているかどうかを確認するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-04 21:05:02
オリジナル
238 人が閲覧しました

How to Determine if an `interface{}` Variable Holds a Slice in Go?

インターフェース変数の型の決定: ゴルディアンの結び目のスライス

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
ログイン後にコピー

追加の考慮事項:

    配列の場合、reflect.TypeOf(v).Kind() == リフレクトの追加チェック。配列はそれらを個別に処理する必要がある場合があります。
  • 潜在的な型アサーションに対して適切なエラー処理を実装する必要があります。失敗しました。

以上がGo で「interface{}」変数がスライスを保持しているかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!