在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
概念:基本类型(basic type)内置基本类型已经在前面的文章基本类型和它们的字面量表示一文中介绍过了。 为了本文的完整性,这些内置类型重新被列在这里:
注意, 除了字符串类型,《Go语言101》后续其它文章将不再对其它基本类型做详细讲解。 概念:组合类型(composite type)Go支持下列组合类型:
非定义组合类型可以用它们各自的字面表示形式来表示。 下面是一些各种不同种类的非定义组合类型字面表示形式的例子(非定义类型将在下面解释):
// 假设T为任意一个类型,Tkey为一个支持比较的类型。 *T // 一个指针类型 [5]T // 一个元素类型为T、元素个数为5的数组类型 []T // 一个元素类型为T的切片类型 map[Tkey]T // 一个键值类型为Tkey、元素类型为T的映射类型 // 一个结构体类型 struct { name string age int } // 一个函数类型 func(int) (bool, string) // 一个接口类型 interface { Method0(string) int Method1() (int, bool) } // 几个通道类型 chan T chan<- T <-chan T
语法:类型定义(type definition declaration)(类型定义又称类型定义声明。在Go 1.9之前,类型定义被称为类型声明并且是唯一的一种类型声明形式。 但是自从Go 1.9,类型定义变成了两种类型声明形式之一。另一种新的类型声明形式为下一节将要介绍的类型别名声明。) 在Go中,我们可以用如下形式来定义新的类型。在此语法中,
type 为一个关键字。// 定义单个类型。 type NewTypeName SourceType // 定义多个类型。 type ( NewTypeName1 SourceType1 NewTypeName2 SourceType2 ) 的类型名必须为标识符。但是请注意:包级类型(以及下一节将要介绍的类型别名)的名称不能为 上例中的第二个类型声明中包含两个类型描述(type specification)。 如果一个类型声明包含多于一个的类型描述,这些类型描述必须用一对小括号 注意:
一些类型定义的例子: // 下面这些新定义的类型和它们的源类型都是基本类型。 type ( MyInt int Age int Text string ) // 下面这些新定义的类型和它们的源类型都是组合类型。 type IntPtr *int type Book struct{author, title string; pages int} type Convert func(in0 int, in1 bool)(out0 int, out1 string) type StringArray [5]string type StringSlice []string func f() { // 这三个新定义的类型名称只能在此函数内使用。 type PersonAge map[string]int type MessageQueue chan string type Reader interface{Read([]byte) int} }
语法:类型别名声明(type alias declaration)类型别名声明是一种在Go 1.9中新增的类型声明形式。) 上面已经提到了,Go中有两个内置类型别名: 从Go 1.9开始,我们可以使用下面的语法来声明自定义类型别名。此语法和类型定义类似,但是请注意其中多了一个等号
= 。type ( Name = string Age = int ) type table = map[string]int type Table = map[Name]Age
类型别名也必须为标识符。同样地,类型别名可以被声明在函数体内。 在上面的类型别名声明的例子中,
Name 是内置类型string 的一个别名,它们表示同一个类型。 同样的关系对下面的几对类型表示也成立:
事实上,文字表示形式 注意,尽管两个别名 类型别名声明在重构一些大的Go项目等场合很有用。 在通常编程中,类型定义声明使用得更广泛。 概念:定义类型和非定义类型(defined type and undefined type)一个定义类型是一个在某个类型定义声明中定义的类型。 所有的基本类型都是定义类型。一个非定义类型一定是一个组合类型。 在下面的例子中,别名
C 和类型字面表示[]string 都表示同一个非定义类型。 类型A 和别名B 均表示同一个定义类型。type A []string type B = A type C = []string 概念:有名类型和无名类型(named type and unnamed type)在Go 1.9之前,有名类型这一术语准确地定义在Go白皮本中。它曾被定义为一个有名字的类型。 随着Go 1.9中引入的类型别名新特性,此术语被从白皮书中删除了,原因是它可能会造成一些理解上的困惑。 比如,一些类型字面表示(比如上一节出现中的别名
概念:底层类型(underlying type)在Go中,每个类型都有一个底层类型。规则:
// 这四个类型的底层类型均为内置类型int。 type ( MyInt int Age MyInt ) // 下面这三个新声明的类型的底层类型各不相同。 type ( IntSlice []int // 底层类型为[]int MyIntSlice []MyInt // 底层类型为[]MyInt AgeSlice []Age // 底层类型为[]Age ) // 类型[]Age、Ages和AgeSlice的底层类型均为[]Age。 type Ages AgeSlice 如何溯源一个声明的类型的底层类型?规则很简单,在溯源过程中,当遇到一个内置类型或者非定义类型时,溯源结束。 以上面这几个声明的类型为例,下面是它们的底层类型的溯源过程: MyInt → int Age → MyInt → int IntSlice → []int MyIntSlice → []MyInt → []int AgeSlice → []Age → []MyInt → []int Ages → AgeSlice → []Age → []MyInt → []int 在Go中,
底层类型这个概念在类型转换、赋值和比较规则中扮演着重要角色。 |
请发表评论