Go 知识点(05)— 类型别名与类型定义
1. 类型别名
类型别名需要在别名和原类型之间加上赋值符号 =
,使用类型别名定义的类型与原类型等价,Go
语言内建的基本类型中就存在两个别名类型。
byte
是uint8
的别名类型;rune
是int32
的别名类型;
类型别名定义形式如下:
type MyString = string
上面代码表明 MyString
是 string
类型的别名类型。也就是说别名类型和源类型表示的是同一个目标,就譬如每个人的学名和乳名一样,都表示同一个人。
定义 string
类型的别名,示例代码:
func main() {type MyString = stringstr := "hello"a := MyString(str)b := MyString("A" + str)fmt.Printf("str type is %T\n", str)fmt.Printf("a type is %T\n", a)fmt.Printf("a == str is %t\n", a == str)fmt.Printf("b > a is %t\n", b > a)
}
输出结果
str type is string
a type is string
a == str is true
b > a is false
定义 []string
类型的别名,示例代码:
func main() {type MyString = stringstrs := []string{"aa", "bb", "cc"}a := []MyString(strs)fmt.Printf("strs type is %T\n", strs)fmt.Printf("a type is %T\n", a)fmt.Printf("a == nil is %t\n", a == nil)fmt.Printf("strs == nil is %t\n", strs != nil)
}
运行结果为:
strs type is []string
a type is []string
a == nil is false
strs == nil is true
从上面结果可以得出以下结论:
- 别名类型与源类型是完全相同的;
- 别名类型与源类型可以在源类型支持的条件下进行相等判断、比较判断、与
nil
是否相等判断等;
2. 类型定义
类型定义是定义一种新的类型,它与源类型是不一样的。看下面代码:
func main() {type MyString stringstr := "hello"a := MyString(str)b := MyString("A" + str)fmt.Printf("str type is %T\n", str)fmt.Printf("a type is %T\n", a)fmt.Printf("a value is %#v\n", a)fmt.Printf("b value is %#v\n", b)// fmt.Printf("a == str is %t\n", a == str)fmt.Printf("b > a is %t\n", b > a)
}
输出结果为:
str type is string
a type is main.MyString
a value is "hello"
b value is "Ahello"
b > a is false
可以看到 MyString
类型为 main.MyString
而原有的 str
类型为 string
,两者是不同的类型,如果使用下面的判断相等语句
fmt.Printf("a == str is %t\n", a == str)
会有编译错误提示
invalid operation: a == str (mismatched types MyString and string)
说明类型不匹配。
下面代码
func main() {type MyString stringstrs := []string{"E", "F", "G"}myStrs := []MyString(strs)fmt.Println(myStrs)
}
编译报错提示
cannot convert strs (type []string) to type []MyString
对于这里的类型再定义来说,string
可以被称为 MyString2
的潜在类型。潜在类型的含义是,某个类型在本质上是哪个类型。潜在类型相同的不同类型的值之间是可以进行类型转换的。
因此,MyString2
类型的值与 string
类型的值可以使用类型转换表达式进行互转。但对于集合类的类型[]MyString2
与 []string
来说这样做却是不合法的,因为 []MyString2
与 []string
的潜在类型不同,分别是 []MyString2
和 []string
。
另外,即使两个不同类型的潜在类型相同,它们的值之间也不能进行判等或比较,它们的变量之间也不能赋值。
func main() {type MyString1 = stringtype MyString2 stringstr := "BCD"myStr1 := MyString1(str)myStr2 := MyString2(str)myStr1 = MyString1(myStr2)myStr2 = MyString2(myStr1)myStr1 = strmyStr2 = str// cannot use str (type string) as type MyString2 in assignmentmyStr1 = myStr2// cannot use myStr2 (type MyString2) as type string in assignmentmyStr2 = myStr1// cannot use myStr1 (type string) as type MyString2 in assignment
}
参考:
https://time.geekbang.org/column/article/13601
Go 知识点(05)— 类型别名与类型定义相关推荐
- Go 学习笔记(27)— type 关键字(类型定义、类型别名、类型查询、定义接口、定义结构体)
1. 类型别名定义 定义类型别名的写法为: type TypeAlias = Type 类型别名规定: TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类 ...
- 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
文章目录 I . 函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 ...
- Go 类型别名与类型声明的区别
语法 type D = int // 类型别名 type I int // 类型声明 复制代码 注:类型别名有一个等号,类型声明没有等号 区别 类型别名和原类型完全一样,只不过是另一种叫法而已,而类型 ...
- C++/C++11中用于定义类型别名的两种方法:typedef和using
类型别名(type alias)是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了.易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的.在C++中,任何 ...
- Go 学习笔记(32)— 类型系统(命名类型、未命名类型、底层类型、类型强制转换、类型别名和新声明类型)
1. 命名类型和未命名类型 1.1 命名类型 类型可以通过标识符来表示,这种类型称为命名类型( Named Type ). Go 语言的基本类型中有 20 个预声明简单类型都是命名类型, Go 语言还 ...
- Go开发 之 基础语法(常量、枚举、注释、类型别名、指针)
文章目录 1.常量(const关键字) 1.1.概念 1.2.iota 常量生成器 1.3.无类型常量 2.枚举(const和iota枚举) 2.1.概念 2.2.将枚举值转换为字符串 3.注释(定义 ...
- TypeScript中的联合类型、类型别名、接口、类型断言
一.联合类型 在TypeScript中,联合类型(Union Types)是指用"|"符号将多个类型组合成一个的类型.这种类型可以包含不同的类型,例如字符串.数字或对象.这些不同类 ...
- 返回值类型与函数类型不匹配_golang基础语法,定义函数类型 为已存在的数据类型起别名...
简介 在 GO 语言中还有另外一种定义使用函数的方式,就是函数类型,所谓的函数类型就是将函数作为一种类型可以用来定义变量,这种用法类似于前面我们讲过的 int ,float64,string 等类型, ...
- 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )
文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...
最新文章
- 论坛报名 | 智能信息检索与挖掘的最新进展和挑战
- 刘道成mysql视频教程_燕十八刘道成Mysql 系列视频教程 Mysql视频教程打包下载
- click事件延迟300ms,处理方法-----FastClick
- 编程之美-找到符合条件的整数
- centos 搭建git服务器
- file协议 控制面板_如何在Windows File Explorer导航窗格中显示控制面板和回收站
- #4604. The kth maximum number(整体二分 + 树套树)
- 三甲医院his系统源码_三甲医院科研管理系统是什么,科研成果包括哪些
- 真正中文攻略之ef - the first tale(含下载和汉化)
- 用matlab做元胞自动机预测,元胞自动机(Cellular Automata)与城市规划及其MATLAB实现——莆田市城市发展预测...
- linux下挂载光驱
- 关于Unicode字符集
- 联想7400打印机如何与手机连到一起_想买一台打印机自己印书看,是买激光的还是喷墨的?...
- MangaEditor(漫画编辑器)v1.10b官方版
- 用 strcoll 实现中文按拼音排序
- 如何获取android手机mac地址,Android手机如何获取Mac地址
- c语言上机试题倒计时,C语言课程实训-显示考试倒计时.doc
- AMD授权X86技术给中国,养虎为患还是另有所谋?
- 微型计算机常见接口设备,微型计算机的外部设备和内部设备各有哪些?
- maxent阈值使用
热门文章
- aws lambda使用, aws无服务器部署应用。 aws ecr凭证获取和使用。
- 远程控制virtual box虚拟机系统的三种方式
- 计算机如何表示色彩?
- 2022-2028年中国石油钻井井下工具行业市场研究及前瞻分析报告
- 卷积神经网络之卷积计算、作用与思想 深度学习
- super(Student,self).__init__()初始化的是什么东西?
- TensorRT深度学习训练和部署图示
- Cuda Stream流 分析
- 语义分割:基于openCV和深度学习(一)
- CVPR2020论文解析:视频语义检索