【问题标题】:Type cast vs type assertion on concrete struct?具体结构上的类型转换与类型断言?
【发布时间】:2013-05-08 21:40:33
【问题描述】:

我是golang的新手,如果这个问题太天真,请道歉。环顾四周,但找不到我的基本问题的答案。

假设我有一个具体的结构和方法,如下所示。

 type MyData struct{
     field1 string
     field2 int 
     }

func(a MyData) OperatorOnString() string{
  return a.field1.(string)
}

func(a MyData) OperatorOnInt() int{
  return a.field2.(int)
}

我的问题是,我可以键入 cast 并返回而不是执行断言吗?从我目前了解到的情况来看,断言用于接口类型的数据。但在这种情况下,我有具体的类型。我应该仍然使用断言还是可以做类似return int(a.field2) 的事情。我知道这个例子很简单,但我感到困惑的是何时在两种转换类型之间使用。还是这里涉及到一些 golang 惯用语?

谢谢

【问题讨论】:

    标签: casting go


    【解决方案1】:

    首先type assertion只能用在接口上:

    对于接口类型的表达式x 和类型T,主表达式

    x.(T)
    

    断言x 不是零并且存储在x 中的值是T 类型。符号x.(T) 称为类型断言。

    但您将其应用于非接口类型字段(intstring)。这使得编译器unhappy

    其次,如果您想从方法/函数返回类型T,返回类型为T 的表达式总是足够的,您的字段已经恰好是。正确的代码很容易:

    package main
    
    import "fmt"
    
    type MyData struct {
            field1 string
            field2 int
    }
    
    func (a MyData) OperatorOnString() string {
            return a.field1
    }
    
    func (a MyData) OperatorOnInt() int {
            return a.field2
    }
    
    func main() {
            a := MyData{"foo", 42}
            fmt.Println(a.OperatorOnString(), a.OperatorOnInt())
    }
    

    Playground


    输出:

    foo 42
    

    【讨论】:

    • 谢谢。但是在实际场景中,我的操作员将有一些参数用于对 MyData 字段进行操作。因此,在返回该字段之前,我是否需要检查类型?
    • @Minty:显示真实代码。很可能你正在混合几个概念,如果没有真正的代码,它不会变得更好。
    • @Minty:如果 fn 返回类型 T,那么只有 T 类型的表达式可以出现在 return expr 中。这与字段无关,与表达式的类型有关。例如。如果说我们在返回int64 的fn 中有var i int,那么我们可以而且必须写return int64(i)。广告“检查类型”:类型检查由编译器自动为您完成。
    • @jnml,完美!!非常感谢。
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    相关资源
    最近更新 更多