1. 类型别名

类型别名需要在别名和原类型之间加上赋值符号 = ,使用类型别名定义的类型与原类型等价,Go 语言内建的基本类型中就存在两个别名类型。

  • byteuint8 的别名类型;
  • runeint32 的别名类型;

类型别名定义形式如下:

type MyString = string

上面代码表明 MyStringstring 类型的别名类型。也就是说别名类型和源类型表示的是同一个目标,就譬如每个人的学名和乳名一样,都表示同一个人。

定义 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)— 类型别名与类型定义相关推荐

  1. Go 学习笔记(27)— type 关键字(类型定义、类型别名、类型查询、定义接口、定义结构体)

    1. 类型别名定义 定义类型别名的写法为: type TypeAlias = Type 类型别名规定: TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类 ...

  2. 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )

    文章目录 I . 函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 ...

  3. Go 类型别名与类型声明的区别

    语法 type D = int // 类型别名 type I int // 类型声明 复制代码 注:类型别名有一个等号,类型声明没有等号 区别 类型别名和原类型完全一样,只不过是另一种叫法而已,而类型 ...

  4. C++/C++11中用于定义类型别名的两种方法:typedef和using

    类型别名(type alias)是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了.易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的.在C++中,任何 ...

  5. Go 学习笔记(32)— 类型系统(命名类型、未命名类型、底层类型、类型强制转换、类型别名和新声明类型)

    1. 命名类型和未命名类型 1.1 命名类型 类型可以通过标识符来表示,这种类型称为命名类型( Named Type ). Go 语言的基本类型中有 20 个预声明简单类型都是命名类型, Go 语言还 ...

  6. Go开发 之 基础语法(常量、枚举、注释、类型别名、指针)

    文章目录 1.常量(const关键字) 1.1.概念 1.2.iota 常量生成器 1.3.无类型常量 2.枚举(const和iota枚举) 2.1.概念 2.2.将枚举值转换为字符串 3.注释(定义 ...

  7. TypeScript中的联合类型、类型别名、接口、类型断言

    一.联合类型 在TypeScript中,联合类型(Union Types)是指用"|"符号将多个类型组合成一个的类型.这种类型可以包含不同的类型,例如字符串.数字或对象.这些不同类 ...

  8. 返回值类型与函数类型不匹配_golang基础语法,定义函数类型 为已存在的数据类型起别名...

    简介 在 GO 语言中还有另外一种定义使用函数的方式,就是函数类型,所谓的函数类型就是将函数作为一种类型可以用来定义变量,这种用法类似于前面我们讲过的 int ,float64,string 等类型, ...

  9. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

最新文章

  1. 论坛报名 | 智能信息检索与挖掘的最新进展和挑战
  2. 刘道成mysql视频教程_燕十八刘道成Mysql 系列视频教程 Mysql视频教程打包下载
  3. click事件延迟300ms,处理方法-----FastClick
  4. 编程之美-找到符合条件的整数
  5. centos 搭建git服务器
  6. file协议 控制面板_如何在Windows File Explorer导航窗格中显示控制面板和回收站
  7. #4604. The kth maximum number(整体二分 + 树套树)
  8. 三甲医院his系统源码_三甲医院科研管理系统是什么,科研成果包括哪些
  9. 真正中文攻略之ef - the first tale(含下载和汉化)
  10. 用matlab做元胞自动机预测,元胞自动机(Cellular Automata)与城市规划及其MATLAB实现——莆田市城市发展预测...
  11. linux下挂载光驱
  12. 关于Unicode字符集
  13. 联想7400打印机如何与手机连到一起_想买一台打印机自己印书看,是买激光的还是喷墨的?...
  14. MangaEditor(漫画编辑器)v1.10b官方版
  15. 用 strcoll 实现中文按拼音排序
  16. 如何获取android手机mac地址,Android手机如何获取Mac地址
  17. c语言上机试题倒计时,C语言课程实训-显示考试倒计时.doc
  18. AMD授权X86技术给中国,养虎为患还是另有所谋?
  19. 微型计算机常见接口设备,微型计算机的外部设备和内部设备各有哪些?
  20. maxent阈值使用

热门文章

  1. aws lambda使用, aws无服务器部署应用。 aws ecr凭证获取和使用。
  2. 远程控制virtual box虚拟机系统的三种方式
  3. 计算机如何表示色彩?
  4. 2022-2028年中国石油钻井井下工具行业市场研究及前瞻分析报告
  5. 卷积神经网络之卷积计算、作用与思想 深度学习
  6. super(Student,self).__init__()初始化的是什么东西?
  7. TensorRT深度学习训练和部署图示
  8. Cuda Stream流 分析
  9. 语义分割:基于openCV和深度学习(一)
  10. CVPR2020论文解析:视频语义检索