在混凝土结构上输入cast和type assertion?
问题描述:
我是golang的新手,很抱歉,如果这个问题太天真了。环顾四周,但找不到我的基本问题的答案。在混凝土结构上输入cast和type assertion?
可以说我有一个具体的结构和方法,如下所示。
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惯用性?
由于
答
首先type assertion只能在接口中使用:
对于接口类型的表达式
x
和类型T
,初级表达
x.(T)
断言
x
不是零,并且存储在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
感谢。然而,在实际情况下,我的操作员将有一些参数用于在MyData字段上操作。因此,在返回该字段之前,是否需要检查类型? – Minty 2013-05-08 13:50:49
@Minty:显示真实的代码。很可能你在混合几个概念,如果没有真正的代码,它不会变得更好。 – Volker 2013-05-08 14:10:57
@Minty:如果一个fn返回类型“T”,那么只有'T'类型的表达式可以出现在'return expr'中。这不是关于领域,而是关于表达的类型。例如。如果我们在返回'int64'的fn中有'var i int',那么我们可以并且必须写'return int64(i)'。广告“检查类型”:类型检查由编译器自动完成。 – zzzz 2013-05-08 14:11:38