这是在golang中的铸造吗?

Posted

技术标签:

【中文标题】这是在golang中的铸造吗?【英文标题】:Is this casting in golang? 【发布时间】:2015-10-01 11:36:08 【问题描述】:

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

括号是干什么用的?我不确定这个赋值操作发生了什么。

您需要更多详细信息来回答这个问题吗?

【问题讨论】:

【参考方案1】:

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

接口类型的值中获取具体类型的值 或获取与初始接口类型不同的值(具有不同method set 的接口,实际上不是原始接口的子集,因为可以使用简单的输入conversion)。

引用规范:

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

x.(T)

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

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

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

这种特殊的形式从不恐慌,不像:

paxPayment = dataObject.(*entities.PassengerPayment)

如果dataObject 不包含*entities.PassengerPayment 类型的值,则会出现恐慌。

【讨论】:

以上是关于这是在golang中的铸造吗?的主要内容,如果未能解决你的问题,请参考以下文章

golang 中的 os.File.Write() 线程安全吗?

我可以将变量类型与 Golang 中的 .(type) 进行比较吗?

golang 一个包内允许有重复的函数吗

golang学习笔记

golang调度学习-调度流程 抢占调度

在Golang中为switch中的类型实现逻辑OR