2015-12-14 65 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