为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
富国沪深 2021-05-11 10:12:24
我要走的很新,我正在玩这个通知包。最初,我有如下代码: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)

}


查看完整回答
反对 回复 2021-05-31
?
墨色风雨

TA贡献1853条经验 获得超6个赞

//an easy way:

str := fmt.Sprint(data)


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 372 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信