我遇到一个奇怪的接口问题,当我尝试打印一个值时,Println会添加方括号。我相信这是因为该接口包含切片,但我不确定应该如何迭代它们。
我很确定这是一个新手问题,但我花了很多时间寻找线索,却找不到任何线索。
如果不使用go,我也无法重现它,所以这里是我实际使用的代码:
package main
import "fmt"
import "github.com/belogik/goes"
import "net/url"
func getConnection() (conn *goes.Connection) {
conn = goes.NewConnection("localhost", "9200")
return
}
func main() {
conn := getConnection()
var query = map[string]interface{}{
"query": map[string]interface{}{
"bool": map[string]interface{}{
"must": map[string]interface{}{
"match_all": map[string]interface{}{},
},
},
},
"from": 0,
"size": 3,
"fields": []string{"name"},
}
extraArgs := make(url.Values)
searchResults, err := conn.Search(query, []string{"myindex"}, []string{"mytype"}, extraArgs)
if err != nil {
panic(err)
}
result := searchResults.Hits.Hits
for _,element := range result {
name := element.Fields["name"]
fmt.Println( name )
fmt.Printf( "%#v\n", name )
}
}
输出:
[One]
[]interface {}{"One"}
[Two]
[]interface {}{"Two"}
[Three]
[]interface {}{"Three"}
但是,如果我尝试像这样循环“名称”:
for _, e := range name {
fmt.Println( e )
}
我得到“不能超过名称范围(类型接口{})”
答案 0 :(得分:0)
使用类型断言。例如,
package main
import "fmt"
func main() {
m := map[string]interface{}{}
m["name"] = []interface{}{"One"}
fmt.Println(m)
name := m["name"]
fmt.Println(name)
fmt.Printf("%#v\n", name)
for _, e := range name.([]interface{}) {
fmt.Println(e)
}
}
输出:
map[name:[One]]
[One]
[]interface {}{"One"}
One
The Go Programming Language Specification
对于接口类型的表达式x和类型T,表示主要的 表达
x.(T)
断言x不是nil,并且存储在x中的值是T类型。 符号x。(T)称为类型断言。