登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-03-09 07:48:26 491浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《无法将数据(类型接口 {})转换为类型字符串:需要类型断言》,就坚持看下去吧!文中内容包含golang等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

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

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

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 := 

之后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 := 

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

正确答案

根据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 */
}

到这里,我们也就讲完了《无法将数据(类型接口 {})转换为类型字符串:需要类型断言》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>