我很新,我正在玩这个 通知 包。
起初我的代码看起来像这样:
func doit(w http.ResponseWriter, r *http.Request) {
notify.Post("my_event", "Hello World!")
fmt.Fprint(w, "+OK")
}
我想将换行符附加到 Hello World!
但不是在上面的函数 doit
中,因为那将是非常微不足道的,但是在 handler
:18-be85c 之后就像下面这样
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)
}
这是我应该做的吗?我的编译器错误消失了,所以我想这很好?这有效率吗?你应该做不同的事吗?
原文由 Alfred 发布,翻译遵循 CC BY-SA 4.0 许可协议
根据 Go 规范:
“类型断言”允许您声明接口值包含特定具体类型或其具体类型满足另一个接口。
在您的示例中,您断言数据(类型接口{})具有具体类型字符串。如果你错了,程序会在运行时出现 panic。您无需担心效率,只需比较两个指针值即可进行检查。
如果您不确定它是否是一个字符串,您可以使用两个返回语法进行测试。
如果数据不是字符串,则 ok 将为 false。然后通常将这样的语句包装到 if 语句中,如下所示: