返回顶部
首页 > 资讯 > 精选 >如何理解Go中的类型别名
  • 195
分享到

如何理解Go中的类型别名

2023-06-15 15:06:04 195人浏览 八月长安
摘要

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

这篇文章主要介绍“如何理解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)  介绍了它的背景。总结一下类型别名的用途,主要有两点:

  • 在大规模重构项目代码的时候,尤其是将一个类型从一个包移动到另一个包中的时候,有些代码会使用新包中的类型,有些代码使用旧包中的类型, 最典型的是  context 包。最开始,context 包名是 golang.org/x/net/context,1.7 开始,引入标准库,这样一来,存在两份。Go 1.9  开始采用别名重构了它;

  • 允许一个庞大的包分解成内部的几个小包,但是小包中的类型需要集中暴漏在上层的大包中;

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

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

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

type MyReader = bufio.Reader

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

  • 别名和原类型是一样的,因此 switch-type 结构中,不能存在两个 case,一个是原类型,一个是别名;

  • 类型别名不能循环定义,比如以下是不允许的:

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中的类型别名”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何理解Go中的类型别名

本文链接: https://lsjlt.com/news/280689.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解Go中的类型别名
    这篇文章主要介绍“如何理解Go中的类型别名”,在日常操作中,相信很多人在如何理解Go中的类型别名问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Go中的类型别名”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • 如何在Golang 中区分类型别名与类型定义
    这篇文章将为大家详细讲解有关如何在Golang 中区分类型别名与类型定义,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。golang适合做什么golang可以做服务器端开发,但golang很适...
    99+
    2023-06-06
  • Go语言中类型别名和自定义类型的示例分析
    这篇文章主要介绍Go语言中类型别名和自定义类型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Go语言中没有类的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构...
    99+
    2024-04-02
  • TypeScript如何使用类型别名
    这篇文章主要介绍了TypeScript如何使用类型别名,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类型别名类型别名会给一个类型起个新名字,...
    99+
    2024-04-02
  • 如何理解与识别Linux中的文件类型
    前言 众所周知,在 linux 中一切皆为文件,包括硬盘和显卡等。在 Linux 中导航时,大部分的文件都是普通文件和目录文件。但是也有其他的类型,对应于 5 类不同的作用。因此,理解 Linux 中的文件类型在许多方面...
    99+
    2022-06-04
    linux文件类型 linux文件类型包括 linux判断文件类型
  • Go语言类型别名指的是什么
    这篇文章主要介绍了Go语言类型别名指的是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言类型别名指的是什么文章都会有所收获,下面我们一起来看看吧。在Go语言中,类型别名就是为已存在的“类型”定义一个别...
    99+
    2023-07-05
  • PHP8.0中新的类型别名语法
    随着PHP 8.0 的发布,新增了一种类型别名语法,使得使用自定义的类型变得更加容易。在本文中,我们将深入了解这种新的语法,以及它对开发人员的影响。什么是类型别名?在PHP中,类型别名本质上是一个变量,它引用另一个类型的名称。这个变量可以像...
    99+
    2023-05-14
    PHP 语法 类型别名
  • go语言中值类型和指针类型的深入理解
    golang这个语言用起来和java、 c#之类语言差不多,和c/c++差别比较大,有自动管理内存机制,省心省力。 然而,如果写golang真的按写java的习惯去写,也容易出问题,...
    99+
    2024-04-02
  • 使用类型别名强制转换 go 数组
    在Go语言中,使用类型别名强制转换数组是一种常见的操作。类型别名可以为已有的类型创建一个新的名称,从而方便进行类型转换。通过使用类型别名,我们可以将一个数组转换为另一种类型的数组。这种...
    99+
    2024-02-12
    go语言
  • 解析Go 中的 rune 类型
    刚接触 Go 语言时,就听说有一个叫rune的数据类型,即使查阅过一些资料,对它的理解依旧比较模糊,加之对陌生事物的天然排斥,在之后很长一段时间的编程工作中,我都没有让它出现在我的代...
    99+
    2024-04-02
  • 如何理解Java内部类中的匿名内部类
    如何理解Java内部类中的匿名内部类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。匿名内部类  匿名内部类应该是平时我们编写代码时用得最多的,在编写事件监听的代码时使用匿名...
    99+
    2023-06-05
  • 泛型容器在 C++ 中的类型推断和别名?
    c++++ 中的类型推断和别名增强了泛型容器的灵活性,使其能够自动推断元素类型并使用更简洁的名称。具体来说:类型推断: 编译器自动推断容器及其元素的类型,简化了代码。别名: 可以定义别名...
    99+
    2024-04-24
    类型推断 别名 c++
  • Go语言中,如何处理各种数据类型?
    Go语言是一种强类型语言,它支持各种数据类型,包括整型、浮点型、字符型、布尔型、字符串、数组、切片、映射、结构体等等。在Go语言中,使用这些数据类型来完成各种任务是非常常见的。 在本文中,我们将探讨Go语言中如何处理各种数据类型,并提供一...
    99+
    2023-10-01
    重定向 数据类型 shell
  • C#中如何使用匿名类型
    这篇文章将为大家详细讲解有关C#中如何使用匿名类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#匿名类型在C#里有这样一些类型,它是作为临时储存数据的,生命周期只在这个方法内,方法结束了...
    99+
    2023-06-18
  • 如何在Go中访问父类型对象中的子类型属性?
    在Go语言中,我们经常会遇到需要在父类型对象中访问子类型属性的情况。这可能是因为我们在定义结构体时,使用了嵌套结构体的方式。但是,由于Go语言中是没有继承的概念的,所以不能直接通过父类...
    99+
    2024-02-09
    go语言
  • 如何理解C#值类型和引用类型
    本篇内容主要讲解“如何理解C#值类型和引用类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解C#值类型和引用类型”吧!C#值类型数据直接在他自身分配到的内存中存储数据,而C#引用类型只是...
    99+
    2023-06-17
  • 如何理解C语言中的指针类型
    如何理解C语言中的指针类型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。0.问题知乎上回答了一个粉丝问题,结果这兄弟又连续问了...
    99+
    2024-04-02
  • C++11/14如何使用typedef和using定义类型别名和别名模版
    目录定义类型别名使用using定义类型别名定义别名模板总结使用typedef定义类型别名 C++11/14标准中引入了一种新的语法:别名声明。它是一种定义类型别名和别名模版的方式,可...
    99+
    2023-05-17
    C++定义类型别名模版 C++ typedef using
  • C++ 函数声明中的类型签名:理解各种类型推导规则
    c++++ 函数声明中的类型签名指定了函数的输入和输出类型,通过理解类型推导规则,可以编写可靠且可维护的代码。规则包括:模板推导:类型参数从函数调用中推导出自动类型推导:类型从初始化器或...
    99+
    2024-05-04
    c++ 函数签名 类型推导
  • GO 中的打包框架:如何处理不同的数据类型?
    在 GO 语言中,打包框架是一个非常重要的概念。它可以将不同类型的数据打包成一个二进制流,以便在网络上传输或存储到磁盘中。GO 语言中的打包框架非常强大,可以处理不同的数据类型,包括基本数据类型、结构体、数组、切片和映射等。 在 GO 语...
    99+
    2023-11-01
    打包 框架 数据类型
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作