我是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惯用语?
由于
答案 0 :(得分:11)
首先,type assertion只能在接口上使用:
对于接口类型的表达式
x
和类型T
,主表达式
x.(T)
断言
x
不是nil,而x
中存储的值是T
类型。符号x.(T)
称为类型断言。
但是您将其应用于非界面类型字段(int
和string
)。这使得编译器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())
}
输出:
foo 42