Println打印方括号,但界面不是切片

时间:2014-10-04 12:40:59

标签: go

我遇到一个奇怪的接口问题,当我尝试打印一个值时,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 )
}

我得到“不能超过名称范围(类型接口{})”

1 个答案:

答案 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

     

Type assertions

     

对于接口类型的表达式x和类型T,表示主要的   表达

x.(T)
     

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