我要走的很新,我正在玩这个通知包。最初,我有如下代码:func doit(w http.ResponseWriter, r *http.Request) { notify.Post("my_event", "Hello World!") fmt.Fprint(w, "+OK")}我想Hello World!在doit上面的函数中添加换行符,但不要在其中添加,因为这很简单,但是在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)经过一番谷歌搜索后,我在SO上发现了这个问题。然后,我将代码更新为: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)}这是我应该做的吗?我的编译器错误消失了,所以我想那很好吗?这样有效吗?您应该以其他方式做吗?
3 回答
慕婉清6462132
TA贡献1804条经验 获得超2个赞
类型断言
这type assertion在golang中是众所周知的,这是一种常见的做法。
这是go之旅的解释:
类型断言提供对接口值的基础具体值的访问。
t := i.(T)
该语句断言接口值i拥有具体类型T,并将基础T值分配给变量t。
如果我不持有T,则该语句将引发恐慌。
为了测试接口值是否具有特定类型,类型断言可以返回两个值:基础值和报告断言是否成功的布尔值。
t, ok := i.(T)
如果我持有T,则t将是基础值,而ok将为真。
如果不是,则ok将为false,t将为T类型的零值,并且不会发生任何恐慌。
注意:值i应为接口类型。
陷阱
即使i是接口类型,[]i也不是接口类型。因此,为了转换[]i为其值类型,我们必须单独进行操作:
// var items []i
for _, item := range items {
value, ok := item.(T)
dosomethingWith(value)
}
- 3 回答
- 0 关注
- 372 浏览
添加回答
举报
0/150
提交
取消