这是在golang的演员吗?

时间:2015-07-13 09:10:04

标签: go types type-conversion

paxPayment, ok = dataObject.(*entities.PassengerPayment)

用于括号的是什么?我不确定此分配操作中发生了什么。

您是否需要更多详细信息才能回答这个问题?

1 个答案:

答案 0 :(得分:30)

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

  • interface type
  • 的值中获取具体类型的值
  • 或获取不同接口类型的值而不是初始接口类型(具有不同method set的接口,实际上不是原始接口类型的子集,因为可以简单地使用一个简单的类型conversion)。

引自规范:

  

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

x.(T)
     

断言x不是nil,而x中存储的值的类型为T。符号x.(T)称为类型断言

     

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

更具体地说,您的示例是一种特殊形式,它还会报告类型断言是否成立。如果不是,则ok将为false,如果断言成立,则ok将为true

这种特殊形式从不会像以下形式一样恐慌:

paxPayment = dataObject.(*entities.PassengerPayment)

如果dataObject未包含*entities.PassengerPayment类型的值,则会出现紧急情况。