2015-12-14 35 views
-1

这里是我的代码 http://play.golang.org/p/h0N4t2ZAKQgoLang通结构的功能(参数接口{})

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不打印你好 不知道为什么。有人可以澄清吗? 在此先感谢

回答

0

如果运行你的程序,你会注意到的一件事是“ok”的值是fal这就是你的打印语句如果没有被执行的原因。如果您从z中删除“ok”,ok:= y。(Msg),您将看到Go在执行此断言语句时抛出的错误。好吧,Go不会惊慌,如果断言失败,将返回false。你的情况正在发生。

断言失败的原因是,预期打印方法的类型是Msg(main.Msg),但传递的是指针,即* main.Msg。你会看到这个错误,当你不使用“OK”

所以一个办法就是

print(*foo) 

或者

z, ok := y.(*Msg) 
+0

太谢谢你了。有效 – Anne