这是我的代码 http://play.golang.org/p/h0N4t2ZAKQ
package main
import (
"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 不知道为什么。有人可以澄清吗? 提前致谢
答案 0 :(得分:0)
程序中foo
的类型为*Msg
(指向Msg的指针),而不是Msg
。您需要在y
(http://play.golang.org/p/MTi7QhSVQz)中将*Msg
投放到print
:
z, ok := y.(*Msg)
或者,您可以使用Msg
类型foo
(http://play.golang.org/p/XMftjVtzBk):
foo := Msg{Message: "Hello"}
或
var foo Msg
foo.Message = "Hello"
答案 1 :(得分:0)
如果您运行程序,您会注意到的一件事是“ok”的值为false,这就是如果没有执行则打印语句的原因。如果从z中删除“ok”,ok:= y。(Msg),您将看到执行此断言语句时Go正在抛出的错误。好的,Go不会出现恐慌,如果断言失败,将返回false。你的情况正在发生。
断言失败的原因是,打印方法中的类型是Msg(main.Msg),但传递的是指针,即* main.Msg。当您不使用“ok”
时,您将看到此错误所以一种方法是
print(*foo)
或者
z, ok := y.(*Msg)