2014-10-04 15 views
1

我遇到接口的一个奇怪问题,当我尝试打印一个值时Println添加方括号。我相信这是因为该界面包含切片,但我不确定应该如何迭代它们。Println打印方括号但界面不是一个切片

我很确定这是一个新手问题,但我花了很多时间寻找线索,找不到任何。

而且我不能没有使用去复制它,所以这里的,我实际使用的代码:

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

使用类型断言。例如,

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

Type assertions

当x接口类型和类型T的表达式,主 表达

x.(T) 

断言x不是零,并且存储在x中的值是T类型。 符号x。(T)被称为类型断言。

+0

谢谢,我现在明白了,也是'name。([] interface {})[0]'给了我我想要的东西,因为我不关心其他值。 – 2014-10-04 14:38:04

+0

@PokazC记住,如果切片是空的,那会导致运行时恐慌。 – OneOfOne 2014-10-05 05:11:14