这是我的代码 http://play.golang.org/p/h0N4t2ZAKQpackage mainimport ( "fmt" "reflect")type Msg struct { Message string}func print(y interface{}) { z, ok := y.(Msg) fmt.Println(reflect.TypeOf(z)) fmt.Println("Value of ok ", ok) if ok { fmt.Println("Message is "+ z.Message) }}func main() { foo := new(Msg) foo.Message="Hello" fmt.Println("Messege in main "+foo.Message) print(foo)}当我运行它时 z.Message 不打印 Hello 不知道为什么。有人可以澄清吗?提前致谢
2 回答
长风秋雁
TA贡献1757条经验 获得超7个赞
foo
程序中的类型是*Msg
(指向 Msg 的指针),而不是Msg
. 你需要转换y
到*Msg
中print
(http://play.golang.org/p/MTi7QhSVQz):
z, ok := y.(*Msg)
或者,您可以使用Msg
类型foo
(http://play.golang.org/p/XMftjVtzBk):
foo := Msg{Message: "Hello"}
或者
var foo Msg foo.Message = "Hello"
LEATH
TA贡献1936条经验 获得超6个赞
如果你运行你的程序,你会注意到的一件事是“ok”的值是假的,这就是如果没有执行你的打印语句的原因。如果您从 z, ok := y.(Msg) 中删除“ok”,您将看到 Go 在执行此断言语句时抛出的错误。确定后,Go 不会恐慌,如果断言失败,将返回 false。您的情况正在发生这种情况。
断言失败的原因是,预期,打印方法中的类型是 Msg(main.Msg),但传递的是指针,即 *main.Msg。当你不使用“ok”时你会看到这个错误
所以一种方法是
print(*foo)
或者
z, ok := y.(*Msg)
- 2 回答
- 0 关注
- 164 浏览
添加回答
举报
0/150
提交
取消