2017-11-26 2 views
0

に索引付けをサポートしていない私は、このようなマップを持っている:型インタフェースは{} golang

Map := make(map[string]interface{}) 

このマップは、オブジェクトの配列に文字列からマッピングを含むようになっています。配列は、[]Usersまたは[]Hostsのような異なるタイプの配列にすることができます。私は、この配列を取り込ま:

TopologyMap["Users"] = Users_Array 
TopologyMap["Hosts"] = Hosts_Array 

が、私はそれから要素を取得しよう:

Map["Users"][0] 

それがエラーを与える: (type interface {} does not support indexing)

私はそれを克服するにはどうすればよいですか?

答えて

4

インタフェース{}をエクスプレッションタイプのスライスに明示的に変換して、それを達成する必要があります。注意するこの https://play.golang.org/p/yZmniZwFar

+0

はい、それは良いですが、この 'hm:= Map [" hosts "]([Host])'のような追加の割り当てを避けるために 'Map'を設定している間に行うことができますか? –

2

まず最初のような何かがinterface{}functionstructまたは[]structを含む任意のデータ型を保持することができます。エラーはあなたを与えるので:

(type interface {} does not support indexing)

それは何のsliceまたは全くarray値を保持していないことを意味します。この場合のindex0からinterface{}に直接電話するので、Map["Users"]は配列であるとみなします。そうではありません。これは、非常に良いことの1つです。静的な型は、すべてのデータ型がコンパイル時にチェックされることを意味します。あなただけのinterface{}に別のデータ型のパスコードを考える場合にはMap["user"].([]User)のような別のタイプにそれを解析中

panic: interface conversion: interface {} is []main.User, not []main.Host

は、そのエラーを回避するために:あなたは、このような解析エラーを避けるようにしたい場合

下記のスニペット:上記のコード

u, ok := myMap["user"].([]User) 
if ok { 
    log.Printf("value = %+v\n", u) 
} 

は簡単で、あなたが解析しているタイプのインターフェイスが一致しているかどうかを確認するためにそれを使用することができます。

そして、あなたは、あなたが最初reflect.TypeOf()を使用して、それをチェックすることができ、実行時に、あなたのinterface{}に値を渡すより一般的になりたい場合は、このコードを検討してください:あなたはinterface{}の値は、あなたのことが可能です知っている後

switch reflect.TypeOf(myMap["user"]).String() { 
case "[]main.User": 
    log.Println("map = ", "slice of user") 
    logger.Debug("map = ", myMap["user"].([]User)[0]) 

case "[]main.Host": 
    log.Println("map = ", "slice of host") 
    logger.Debug("map = ", myMap["user"].([]Host)[0]) 

} 

あなたの特定のデータ型、この場合はユーザー[]Userのスライスを自信を持って解析します。あなたにはパッケージ名を変更することはできません。main

+2

ここに反映させる理由はありません。 u、ok:= myMap ["user"]。([User]) – Peter

+0

私を修正していただきありがとうございます、あなたはそれについて正しいです。私は今私の答えを編集する –

+0

@Peter pls更新された回答を参照してください –

関連する問題