Go でのインターフェイス タイプのインデックス作成: 「無効な操作」エラーの解決
Go で「無効な操作: type interface {」というエラーが発生しました} はインデックス作成をサポートしていません」というメッセージが表示され、インターフェイス タイプ (interface{}) のインデックスを作成しようとするとイライラすることがあります。このエラーは、最初に特定のデータ型にアサートせずにインターフェイスのフィールドまたはメソッドにアクセスしようとすると発生します。
問題:
次のコード スニペットを考えてみましょう。 :
<code class="go">var d interface{} json.NewDecoder(response.Body).Decode(&d) test := d["data"].(map[string]interface{})["type"]</code>
d に格納されているネストされた JSON 応答の「type」フィールドにアクセスしようとすると、「無効な操作」エラーが発生する場合があります。これは、d の型がインターフェイス{}であり、任意の型を抽象化し、本質的にインデックス作成をサポートしていないためです。
解決策:
このエラーを解決するには、以下が必要です。型アサーションを実行して、インターフェイスをインデックス付けをサポートする既知の型に変換します。この場合、d はマップであると予想されるため、次のコードを使用できます:
<code class="go">test := d.(map[string]interface{})["data"].(map[string]interface{})["type"] fmt.Println(test)</code>
まず、d がマップ[文字列]インターフェイス{}であることをアサートします。これにより、文字列キーによってインデックスを付けることができます。次に、「data」フィールドにアクセスし、アサーション プロセスを繰り返してその値を取得します。
代替アプローチ:
あるいは、 d を map[ として宣言することもできます。 string]interface{} を直接使用して、最初の型アサーションの必要性を排除します。
<code class="go">var d map[string]interface{} if err := json.NewDecoder(response.Body).Decode(&d); err != nil { panic(err) } test := d["data"].(map[string]interface{})["type"] fmt.Println(test)</code>
このコードは、前のアプローチと同じ機能を保持しています。
追加の注意:
このインデックス作成の問題が頻繁に発生する場合は、Go での動的オブジェクトの操作を簡素化する github.com/icza/dyno などのライブラリの利用を検討してください。
以上がGo の「無効な操作: Type Interface {} Does Not Support Indexing」エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。