一尘不染

无法将数据(类型接口{})转换为字符串类型:需要类型断言

go

我要走的很新,我正在玩这个通知包。

最初,我有如下代码:

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)
}

这是我应该做的吗?我的编译器错误消失了,所以我想那很好吗?这样有效吗?您应该以其他方式做吗?


阅读 443

收藏
2020-07-02

共1个答案

一尘不染

根据Go规范

对于接口类型和类型T的表达式x,主表达式x。(T)断言x不是nil,并且存储在x中的值是T类型。

“类型断言”允许您声明一个接口值包含某个特定类型或它的具体类型满足另一个接口。

在您的示例中,您断言数据(类型interface {})具有具体的类型字符串。如果输入错误,则程序将在运行时崩溃。您无需担心效率,只需要比较两个指针值即可。

如果不确定是否为字符串,则可以使用两种返回语法进行测试。

str, ok := data.(string)

如果data不是字符串,则ok为假。然后通常将这样的语句包装到if语句中,如下所示:

if str, ok := data.(string); ok {
    /* act on str */
} else {
    /* not string */
}
2020-07-02