Go语言type关键字的多种用法(附带实例)
在 Go 语言,type 关键字有多种不同的用法,大致可分为两类,分别是类型别名和类型定义。
类型别名是对已有数据类型赋予新命名,如一个孩子在小时候有小名、乳名,上学后用学号或者英文名,这些名字都代表他本人。类型别名主要解决代码升级、迁移中存在的类型兼容性问题。
类型定义是自定义数据类型,但自定义数据类型必须在已有数据类型基础上进行定义,最常见的是类型定义为结构体和接口。
类型别名与类型定义在代码结构上十分相似,两者之间的语法差异如下:
为了更好地说明类型别名与类型定义的差异,我们通过简单的例子加以说明,代码如下:
从运行结果分析得知:
在实际开发中,通常使用类型定义对一些数据结构进行封装处理,尽管类型定义是以 Go 语言的数据类型为基础的,但在此基础上仍能创建或组合多种复杂的数据类型,示例如下:
1) 使用关键字 type 定义结构体 mystruct,并设置结构体成员 name;然后使用关键字 type 定义类型 mystyle,其数据类型来自结构体 mystruct。
2) 在主函数 main() 中定义变量 s,其数据类型为 mystyle,由变量 s 设置属性 name 的值。
3) 分别使用格式化参数 %v 和 %T 查看变量 s 的数据和类型,数据类型为 mystyle,从输出结果已无法得知 mystyle 的定义过程,从而在某程度上达到代码封装的效果。
类型别名是对已有数据类型赋予新命名,如一个孩子在小时候有小名、乳名,上学后用学号或者英文名,这些名字都代表他本人。类型别名主要解决代码升级、迁移中存在的类型兼容性问题。
类型定义是自定义数据类型,但自定义数据类型必须在已有数据类型基础上进行定义,最常见的是类型定义为结构体和接口。
类型别名与类型定义在代码结构上十分相似,两者之间的语法差异如下:
// 类型别名 type name = Type // 类型定义 type name Type
为了更好地说明类型别名与类型定义的差异,我们通过简单的例子加以说明,代码如下:
package main import ( "fmt" ) // 将string类型取一个别名叫meString type meString = string // 将myString定义为string类型 type myString string func main() { // 将s1声明为meString类型 var s1 meString // 查看s1的类型名 fmt.Printf("s1的数据类型为:string %T\n", s1) // 将s2声明为myString类型 var s2 myString // 查看s2的类型名 fmt.Printf("s2的数据类型为:%T\n", s2) }运行上述代码,运行结果为:
s1的数据类型为:string
s2的数据类型为:main.myString
从运行结果分析得知:
- 将 meString 设置为字符串 string 的一个别名,它等同于字符串类型 string;
- 将 myString 定义为字符串类型 string,通过关键字 type 定义,myString 成为自定义数据类型,但它依然具备字符串类型 string 的特性;
- 变量 s1 设置为 meString 类型,格式化参数 %T 能查看变量 s1 的数据类型,输出结果为字符串类型;
- 变量 s2 设置为 myString 类型,格式化参数 %T 能查看变量 s2 的数据类型,输出结果为自定义类型 myString,并且该类型在 main 包中定义。
在实际开发中,通常使用类型定义对一些数据结构进行封装处理,尽管类型定义是以 Go 语言的数据类型为基础的,但在此基础上仍能创建或组合多种复杂的数据类型,示例如下:
package main import "fmt" // 定义结构体 type mystruct struct { name string } // 将mystyle定义为mystruct类型 type mystyle mystruct func main() { // 将s声明为mystyle类型 var s mystyle // 设置属性name的值 s.name = "Tom" // 输出变量s的数据 fmt.Printf("变量s的数据:%v\n", s) // 输出变量s的数据类型 fmt.Printf("变量s的数据类型:%T\n", s) }运行上述代码,运行结果为:
变量s的数据:{Tom}
变量s的数据类型:main.mystyle
1) 使用关键字 type 定义结构体 mystruct,并设置结构体成员 name;然后使用关键字 type 定义类型 mystyle,其数据类型来自结构体 mystruct。
2) 在主函数 main() 中定义变量 s,其数据类型为 mystyle,由变量 s 设置属性 name 的值。
3) 分别使用格式化参数 %v 和 %T 查看变量 s 的数据和类型,数据类型为 mystyle,从输出结果已无法得知 mystyle 的定义过程,从而在某程度上达到代码封装的效果。