栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在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
,断言起作用。因此,您正在做的事情是不可能的。

奖金:

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436155.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号