首页 > 后端开发 > Golang > 为什么 Go 中具有多个 case 的类型切换会导致'未定义”变量错误,如何解决?

为什么 Go 中具有多个 case 的类型切换会导致'未定义”变量错误,如何解决?

Mary-Kate Olsen
发布: 2024-12-16 10:53:11
原创
304 人浏览过

Why Does a Type Switch with Multiple Cases in Go Cause

Go 中具有多种情况的类型开关

当使用具有多种情况的类型开关时,可能会遇到错误,指出变量具有多种类型的情况是未定义的。此行为源于 Go 语言规范,该规范规定类型切换保护可以包含简短的变量声明。

在这种情况下,变量的类型与单类型情况中列出的类型相同。但是,在具有多种类型列表的情况下,变量具有类型开关保护中表达式的类型。

为了说明这一点,请考虑以下代码:

type A struct {
  a int
}

func (this *A) test() {
  fmt.Println(this)
}

type B struct {
  A
}

var foo interface{}
foo = A{}

switch a := foo.(type) {
  case B, A:
    a.test()
}
登录后复制

运行此代码将导致错误“a.test undefined(类型interface {}是没有方法的接口)”。这是因为变量 a 具有类型 interface{},而不是特定情况的类型。

要解决此问题,可以断言类型开关保护表达式具有预期的方法。例如:

type tester interface {
  test()
}

func main() {
  var foo interface{}
  foo = &B{}

  if a, ok := foo.(tester); ok {
    fmt.Println("foo has test() method")
    a.test()
  }
}
登录后复制

这段代码首先检查 foo 是否有 test() 方法,如果有,则将 foo 的值赋给 a 并调用 test() 方法。

以上是为什么 Go 中具有多个 case 的类型切换会导致'未定义”变量错误,如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!

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