慕的地6264312
2021-11-29 16:08:52
這是我的代碼 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)}當(dāng)我運(yùn)行它時(shí) z.Message 不打印 Hello 不知道為什么。有人可以澄清嗎?提前致謝
2 回答

長(zhǎng)風(fēng)秋雁
TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
foo
程序中的類型是*Msg
(指向 Msg 的指針),而不是Msg
. 你需要轉(zhuǎn)換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貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果你運(yùn)行你的程序,你會(huì)注意到的一件事是“ok”的值是假的,這就是如果沒有執(zhí)行你的打印語句的原因。如果您從 z, ok := y.(Msg) 中刪除“ok”,您將看到 Go 在執(zhí)行此斷言語句時(shí)拋出的錯(cuò)誤。確定后,Go 不會(huì)恐慌,如果斷言失敗,將返回 false。您的情況正在發(fā)生這種情況。
斷言失敗的原因是,預(yù)期,打印方法中的類型是 Msg(main.Msg),但傳遞的是指針,即 *main.Msg。當(dāng)你不使用“ok”時(shí)你會(huì)看到這個(gè)錯(cuò)誤
所以一種方法是
print(*foo)
或者
z, ok := y.(*Msg)
- 2 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報(bào)
0/150
提交
取消