まず最初のような何かがinterface{}
がfunction
とstruct
または[]struct
を含む任意のデータ型を保持することができます。エラーはあなたを与えるので:
(type interface {} does not support indexing)
それは何のslice
または全くarray
値を保持していないことを意味します。この場合のindex
は0
から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
はい、それは良いですが、この 'hm:= Map [" hosts "]([Host])'のような追加の割り当てを避けるために 'Map'を設定している間に行うことができますか? –