错误:需要类型断言

时间:2016-11-18 18:18:33

标签: go tiedot

我以为我已断言(据我所知,Go),但我一直收到这个错误 cannot use readBack["SomePIN"] (type interface {}) as type string in argument to c.String: need type assertion

这是我的代码(此代码片段来自Request Handler函数,我正在使用Echo Web框架和Tiedot NoSQL数据库)

// To get query result document, simply 
// read it [as stated in the Tiedot readme.md]
for id := range queryResult {
    readBack, err := aCollection.Read(id)
    if err != nil {
        panic(err)
    }
    if readBack["OtherID"] == otherID {
        if _, ok := readBack["SomePIN"].(string); ok {
            return c.String(http.StatusOK, readBack["SomePIN"])
        }
    }
}

2 个答案:

答案 0 :(得分:6)

您在readBack["SomePIN"]声明中声明if为字符串 - 。但这并没有对readBack["SomePIN"]进行任何更改,但它仍然是一个接口{}。在Go中,没有任何改变类型。这将是有用的:

for id := range queryResult {
    readBack, err := aCollection.Read(id)
    if err != nil {
        panic(err)
    }
    if readBack["OtherID"] == otherID {
        if somePIN, ok := readBack["SomePIN"].(string); ok {
            return c.String(http.StatusOK, somePIN)
        }
    }
}

你正在从类型断言中抛出字符串值,但是你想要它。所以保持它为somePIN,然后使用它。

最后注意事项 - 使用value, ok = interfaceVal.(type)语法是一种很好的做法。如果interfaceVal变为非字符串,您将获得value = ""ok = false。如果从类型断言中删除ok值并且interfaceVal是非字符串,则程序将发生混乱。

答案 1 :(得分:3)

看起来您转换为具体类型并丢弃转换,我认为这应该有效:

    if somePinString, ok := readBack["SomePIN"].(string); ok {
        return c.String(http.StatusOK, somePinString)
    }