我要走的很新,我正在玩這個(gè)通知包。最初,我有如下代碼:func doit(w http.ResponseWriter, r *http.Request) { notify.Post("my_event", "Hello World!") fmt.Fprint(w, "+OK")}我想Hello World!在doit上面的函數(shù)中添加換行符,但不要在其中添加,因?yàn)檫@很簡單,但是在handler下面的代碼中,如下所示:func handler(w http.ResponseWriter, r *http.Request) { myEventChan := make(chan interface{}) notify.Start("my_event", myEventChan) data := <-myEventChan fmt.Fprint(w, data + "\n")}之后go run:$ go run lp.go # command-line-arguments./lp.go:15: invalid operation: data + "\n" (mismatched types interface {} and string)經(jīng)過一番谷歌搜索后,我在SO上發(fā)現(xiàn)了這個(gè)問題。然后,我將代碼更新為:func handler(w http.ResponseWriter, r *http.Request) { myEventChan := make(chan interface{}) notify.Start("my_event", myEventChan) data := <-myEventChan s:= data.(string) + "\n" fmt.Fprint(w, s)}這是我應(yīng)該做的嗎?我的編譯器錯(cuò)誤消失了,所以我想那很好嗎?這樣有效嗎?您應(yīng)該以其他方式做嗎?
3 回答

慕婉清6462132
TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
類型斷言
這type assertion在golang中是眾所周知的,這是一種常見的做法。
這是go之旅的解釋:
類型斷言提供對(duì)接口值的基礎(chǔ)具體值的訪問。
t := i.(T)
該語句斷言接口值i擁有具體類型T,并將基礎(chǔ)T值分配給變量t。
如果我不持有T,則該語句將引發(fā)恐慌。
為了測試接口值是否具有特定類型,類型斷言可以返回兩個(gè)值:基礎(chǔ)值和報(bào)告斷言是否成功的布爾值。
t, ok := i.(T)
如果我持有T,則t將是基礎(chǔ)值,而ok將為真。
如果不是,則ok將為false,t將為T類型的零值,并且不會(huì)發(fā)生任何恐慌。
注意:值i應(yīng)為接口類型。
陷阱
即使i是接口類型,[]i也不是接口類型。因此,為了轉(zhuǎn)換[]i為其值類型,我們必須單獨(dú)進(jìn)行操作:
// var items []i
for _, item := range items {
value, ok := item.(T)
dosomethingWith(value)
}
- 3 回答
- 0 關(guān)注
- 402 瀏覽
添加回答
舉報(bào)
0/150
提交
取消