如何理解Go中的类型别名

发布时间:2021-10-14 15:48:55 作者:iii
来源:亿速云 阅读:190

这篇文章主要介绍“如何理解Go中的类型别名”,在日常操作中,相信很多人在如何理解Go中的类型别名问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Go中的类型别名”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

有下面 3 行代码:

// 32 位机器 1)var x int32 = 32.0 2)var y int = x 3)var z rune = x

它们是否能编译通过?为什么?

如果面试时问这道题,你需要想想面试官想考察你什么。在往下看之前,建议你记下自己的答案。

01 数字字面量

在 Go 语言中,字面量是无类型(untyped)的。无类型是什么意思?无类型意味着可以赋值给类似类型的变量或常量。用上面例子,32.0  是无类型的浮点数字面量,因此它可以赋值给任意数字相关类型变量(或常量)。以下都是合法的:

var a int64 = 32.0 var b int = 32.0 var c float32 = 32.0 var d complex64 = 32.0 var e byte = 32.0 var f rune = 32.0

所以上题中 1)是正确的。

02 不同类型

在目前 Go 1.16 版本中(实际上只有很早期的版本不是),int 类型在 32 位机器占 4 字节,64 位机器占 8 字节。所以,在 32  位机器上,int32 和 int 的内存占用和内存布局是完全一样的。但 Go 语言不会做隐式类型转换,int 和 int32 是不同的类型,因此上题中  2)编译不通过。

03 类型别名

熟悉 C 语言的小伙伴,看到 Go 中以下定义:

type myint int

会以为 myint 和 int 是一样的,认为 myint 是 int 的别名。而实际上,myint 是和 int 完全不一样的类型,只不过 myint  的底层类型是 int,它们直接可以强制类型转换,却不会隐式转换。关于这点无需多讲,重点要讲的是类型别名。

从 Go1.9 开始引入了类型别名,定义如下:

AliasDecl = identifier, "=", Type .

具体例子:

type intalias = int

myint 是新类型,和 int 不一样;而 intalias 却和 int 一样,它只是 int 的别名:所有使用 intalias 的地方都可以使用  int。

那为什么 Go 中会引入类型别名呢?Russ Cox 的论文 Codebase Refactoring (with help from Go)  介绍了它的背景。总结一下类型别名的用途,主要有两点:

在 Go 中,你可以为任意类型定义别名,比如数组、结构体、指针、函数、接口、Slice、Map、Channel 等,包括为自定义类型定义别名。

type F = func() type I = interface{} ...

此外,还可以为其他包中的类型定义别名,比如为标准库类型定义别名:

type MyReader = bufio.Reader

关于类型别名的一些注意事项:

type T = struct {  next *T1 }  type T1 = T
type MyReader = bufio.Reader func (MyReader) AliasMethod() {  fmt.Println("This is alias method") }

编译报错:cannot define new methods on non-local type bufio.Reader。

回到开头题目的 3),rune 是什么类型?定义如下:

type rune = int32

很显然,rune 是 int32 的别名,因此题目中 3)也能编译通过。

除了 rune,Go 内置类型中,还有 byte 是 uint8 的别名:

type byte = uint8

需要说明的是,在 Go1.9 之前,rune 和 byte 的别名性质就存在,是编译器负责处理的。只是 Go1.9 之后,别名可以用于其他类型了。

到此,关于“如何理解Go中的类型别名”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. go channel 理解
  2. 详解go中的引用类型

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

go

上一篇:PHP扩展开发中什么函数返回值

下一篇:PHP中如何将时间显示为"刚刚""n分钟/小时前"

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》