Go 类型切换中的多种情况
将接口值分配给类型切换变量时,结果类型取决于情况列表结构。 switch-case 语句中的多个 case 列表可能会导致意外行为。
在您提供的代码片段中:
switch a := foo.(type){ case B, A: a.test() }
出现错误是因为变量 a 的类型是 interface{} ,而不是 A 或 B。这是因为 case 列表包含多种类型,所以 a 的类型与接口表达式 (foo) 的类型保持一致。
要解析这样,case 列表应该只包含单一类型:
switch a := foo.(type){ case A: a.test() }
通过将 case 列表限制为特定类型,变量 a 将具有预期的类型,从而允许方法调用成功。
或者,您可以使用断言表达式显式断言接口类型:
if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() }
在这种情况下,变量 a 仅具有预期类型,如果断言成功(即 ok 为 true)。
以上是Go 类型开关中的多个情况如何导致意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!