如何在Go中强制转换为类型别名?

如何在Go中强制转换为类型别名?,第1张

如何在Go中强制转换类型别名? tl; dr

对于类型断言(您使用的类型),仅实际类型很重要。因此

somethingFuncy
,仅等于
somethingFuncy
和不等于
func(int)bool

说明

首先,这与铸造无关。进行中没有强制转换。有类型断言和类型转换。

您正在处理类型断言,并假设与类型 转换 具有相同的条件。在阅读您的问题时,我犯了同样的错误,但实际上在行为上存在巨大差异。

假设您有两种类型,比如

int
type MyIntint
。这些都是可转换的,因为它们都共享相同的基础类型(转换规则之一),因此可以正常工作(播放):

var a int = 10var b MyInt = MyInt(a)

现在,假设

a
不是类型
int
而是
interface{}
(play)类型:

var a interface{} = int(10)var b MyInt = MyInt(a)

编译器会告诉您:

无法将类型接口{}转换为MyInt类型:需要类型断言

所以现在我们不再进行 转换 ,而是 断言 。我们需要这样做(播放):

var a interface{} = int(10)var b MyInt = a.(MyInt)

现在,我们遇到的问题与您的问题相同。此断言由于以下错误而失败:

恐慌:接口转换:接口是int而不是main.MyInt

规范的类型断言部分说明了这种情况的原因:

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

T
,主表达式
x.(T)
断言
x
不是,
nil
并且其中存储的值
x
是类型
T
。该符号
x.(T)
称为类型声明。 更确切地说,如果
T
不是接口类型,
x.(T)
则断言的动态类型
x
与type相同
T

因此

int
必须与相同
MyInt
。类型标识规则声明(除其他规则外):

如果两个命名类型的类型名称源自同一TypeSpec,则它们是相同的。

作为

int
MyInt
有不同的声明(TypeSpecs)他们不是平等的,断言失败。当对断言
a
int
,断言起作用。因此,您正在做的事情是不可能的。

奖金:

实际检查在此代码中进行,该代码仅按预期检查两种类型是否相同。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5125525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存