小编典典

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

all

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

起初我的代码看起来像这样:

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

这是我应该做的吗?我的编译器错误消失了,所以我想这很好吗?这有效率吗?你应该做不同的事情吗?


阅读 114

收藏
2022-06-16

共1个答案

小编典典

根据Go 规范

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

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

在您的示例中,您断言数据(类型接口{})具有具体类型字符串。如果你错了,程序会在运行时恐慌。你不需要担心效率,检查只需要比较两个指针值。

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

str, ok := data.(string)

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

if str, ok := data.(string); ok {
    /* act on str */
} else {
    /* not string */
}
2022-06-16