在具体结构上键入cast vs type断言?

时间:2013-05-08 13:30:13

标签: casting go

我是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)
}

我的问题是,我可以输入强制转换而不是执行断言吗?从我到目前为止所学到的是,断言用于接口类型的数据。但在这种情况下,我有具体的类型。我还应该使用断言还是可以做return int(a.field2)之类的事情。我知道这个例子很简单,但我感到困惑的一点是何时在两种转换类型之间使用。或者这里涉及一些golang惯用语?

由于

1 个答案:

答案 0 :(得分:11)

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

  

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

x.(T)
  

断言x不是nil,而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