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

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


最初,我有如下代码:


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)

}

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


富国沪深
浏览 373回答 3
3回答

慕婉清6462132

类型断言这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 []ifor _, item := range items {&nbsp; &nbsp; value, ok := item.(T)&nbsp; &nbsp; dosomethingWith(value)}

墨色风雨

//an easy way:str := fmt.Sprint(data)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go