首页 > 后端开发 > Golang > Go 中的类型断言:为什么'无法在非接口值上进行类型切换”以及如何修复?

Go 中的类型断言:为什么'无法在非接口值上进行类型切换”以及如何修复?

Susan Sarandon
发布: 2024-11-13 10:56:02
原创
466 人浏览过

Type Assertion in Go: Why

Go 中的类型断言:解决“无法在非接口值上键入切换”错误

在 Go 中使用类型断言时,可能会遇到错误“无法在非接口值上键入 switch”。让我们通过使用自定义类型的示例来深入研究这意味着什么以及如何解决它。

考虑以下代码片段:

package main

import "fmt"
import "strconv"

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
登录后复制

运行此代码时,您将遇到错误“无法在非接口值上键入 switch”。这表明正在对非接口值执行类型断言。在本例中,n 是指向 Number 结构的指针,它不是接口。

解决方案是在尝试类型断言之前将值强制转换为 interface{}。这是因为类型断言只能对接口值执行。这是更正后的代码:

func main() {
    n := &Number{1}
    switch v := interface{}(n).(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
登录后复制

现在,当您运行代码时,它将打印“Stringer:1”。这是因为将 n 强制转换为 interface{} 允许将其视为类型断言的接口值。

以上是Go 中的类型断言:为什么'无法在非接口值上进行类型切换”以及如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板