1 回答
TA贡献1155条经验 获得超0个赞
您的问题是您正在使用 type 的值interface{},这是泛型类型,并且在可能有多个类型时使用。这就是 gorillasession.Flashes() 方法的情况,因为它可以返回任意用户数据(无论您输入什么)。
您可以使用此代码(播放中)重现您遇到的情况:
type MyData struct {
X int
}
// Simulate Flashes() from gorilla, which returns a slice of interface{} values.
func Flashes() []interface{} {
x := &MyData{2}
// Convert x to type interface{}
interfaceValue := interface{}(x)
// Put converted x into a slice of type []interface{}
return []interface{}{interfaceValue}
}
func main() {
// See that [0xSOMETHING] is printed
fmt.Println("Some data:", Flashes())
}
运行此程序时,您将看到如下输出:
一些数据:[0xc010000000]
这与您正在经历的相同。这样做的原因是,fmt.Println除非您告诉它打印所有内容,否则它不会逐步遍历指针和接口的所有抽象级别并在某个级别停止。所以如果你使用
fmt.Printf("Some data: %#v\n", Flashes())
您确实会看到您的数据:
一些数据:[]interface {}{(*main.MyData)(0xc010000000)}
访问数据所要做的就是将结果数据与您期望的类型相匹配。你必须做一个类型断言(播放示例):
func main() {
value := Flashes()[0]
v, ok := value.(*MyData)
if ok {
fmt.Println("Some data:", v)
} else {
fmt.Println("Oh no, there's something else stored than expected")
}
}
在上面的例子中,返回的第一个 flashFlashes()被使用并被断言为类型*MyData。如果确实是这种类型,则将其值打印到控制台。否则,将在控制台上打印一条错误消息(尽管不是很好的消息)。在断言某个类型的变量之后,断言的值就是断言的类型。那就是v上面例子中的 类型*MyType。
- 1 回答
- 0 关注
- 183 浏览
添加回答
举报