2015-07-13 66 views
5

paxPayment, ok = dataObject.(*entities.PassengerPayment)这是在golang的铸造?

括号用于什么?我不确定这次任务中发生了什么。

你需要更多的细节来回答这个问题吗?

+2

它被称为[Type assertion](https://golang.org/ref/spec#Type_assertions)。 – icza

+0

@icza做出答案。 – inf

回答

12

这只是一个Type assertion。 A型断言可用于:

  • 接口类型的值获得混凝土类型的值
  • 或以获得不同接口类型比初始值一(与不同的method set的接口,实际上不是原始子集的子集,因为可以简单地使用简单类型conversion获得)。

从规范引用:

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

x.(T) 

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

更精确地,如果T不是接口类型,x.(T)断言动态类型的xidentical到类型T。在这种情况下,T必须implement(接口)类型x;否则类型断言无效,因为x不可能存储类型为T的值。如果T是接口类型,则x.(T)声明动态类型x实现接口T

更具体地说,你的例子是它的一个特殊形式,它也报告类型断言是否成立。如果不是,ok将是false,如果断言成立,ok将是true

paxPayment = dataObject.(*entities.PassengerPayment) 

如果哪个dataObject不成立*entities.PassengerPayment类型的值会产生恐慌:

这种特殊的形式从来不像形式恐慌。