在混凝土结构上输入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)被称为类型断言。

但是你把它应用到非接口类型的字段(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 
+0

感谢。然而,在实际情况下,我的操作员将有一些参数用于在MyData字段上操作。因此,在返回该字段之前,是否需要检查类型? – Minty 2013-05-08 13:50:49

+0

@Minty:显示真实的代码。很可能你在混合几个概念,如果没有真正的代码,它不会变得更好。 – Volker 2013-05-08 14:10:57

+1

@Minty:如果一个fn返回类型“T”,那么只有'T'类型的表达式可以出现在'return expr'中。这不是关于领域,而是关于表达的类型。例如。如果我们在返回'int64'的fn中有'var i int',那么我们可以并且必须写'return int64(i)'。广告“检查类型”:类型检查由编译器自动完成。 – zzzz 2013-05-08 14:11:38