我以为我已断言(据我所知,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"])
}
}
}
答案 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)
}