Go でインターフェイスを操作する場合、基になる値の型を決定する必要がある場合があります。ここで、reflect パッケージが活躍します。インターフェイス値の型を取得するには、reflect.TypeOf() 関数を使用できます。ただし、型アサーションには Type オブジェクトだけでなく、特定の型が必要です。
提供されたコードでは、reflect.TypeOf( の結果に対して型アサーションを実行しようとしています。 i):
item2 := i.(reflect.TypeOf(i)) // reflect.TypeOf(i) is not a type
reflect.TypeOf(i) は type に使用できる特定の型ではなく、Type オブジェクトを返すため、この行は失敗します。アサーション。
このシナリオにアプローチするには、いくつかの方法があります。 1 つのオプションは、回答で提案されているように、インターフェイス値自体に型スイッチを使用することです。
switch x.(type){ case int: dosomething() }
このアプローチでは、インターフェイスに格納されている値の型をチェックし、それに応じてアクションを実行します。タイプ リフレクションは必要ありません。
あるいは、インターフェイス内の属性のタイプに特にアクセスしてスイッチをオンにする必要がある場合は、次のアプローチを使用できます。
s := reflect.ValueOf(x) for i:=0; i<s.NumValues; i++{ switch s.Field(i).Interface().(type){ case int: dosomething() } }
これには次のことが含まれます。インターフェイスのフィールドを反復処理し、それらの値を取得し、それらの値に対して型チェックを実行します。
このアプローチは、型スイッチを使用するほど簡潔ではありません。インターフェイス値自体に関して、インターフェイス内のさまざまな種類の属性をより柔軟に処理できるようになります。
以上がGo で `reflect.TypeOf()` を使用して型アサーションを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。