类型 Types

类型定义了一组值的集合和基于这组值的操作。类型可以通过类型标识符或类型字面量来表示。

go 预声明了一些必要的类型标识符,它们是:

bool byte complex64 complex128 error float32 float64
int int8 int16 int32 int64 rune string
uint uint8 uint16 uint32 uint64 uintptr
1
2
3

复合类型需要使用类型字面量进行构造,它们是:

array, struct, pointer, function, interface, slice, map, channel
// 数组,结构体,指针,函数,接口,切片,映射表,信道
// 例如
[3]int // array
struct{
    ID int
    Title string
} // struct
*int // pointer
func(int, int) (int, error) // function
interface {} // interface
[]int // slice
map[string]int	// map
chan int	// channel
1
2
3
4
5
6
7
8
9
10
11
12
13
14

本文介绍与数据相关的类型,故而:function、interface、channel另作文介绍。

类型声明 Type declarations

类型声明指的是将类型标识符与某个类型绑定。类型声明分为类型别名和类型定义两种形式。

类型别名 Alias declarations

类型别名声明一个与给出类型绑定的别名。该别名与类型是一致的,就是同一类型而使用了其他名字而已。

语法:

type 类型标识符 = 类型
1

演示:

type age = int
a := age(30)	// type age 
step := 2	// type int
fmt.Println(a + step) // 32
1
2
3
4

上例中,a(age) 和 step(int) 可以直接运算,意味着是同一种数据类型,因为不同的类型是不能直接运算的。

类型定义 Type definitions

类型定义会创建一个新的、独立的类型并与提供的类型标识符绑定,新类型支持的操作与给出类型一致。

语法:

type 类型标识符 类型
// 没有=
1
2

演示:

type height int
1

定义类型 height 是独立的类型,与其他任何类型包括创建于的类型都不相同。意味着两种类型是不能直接做运算的。但定义类型和创建于的类型之间可以作类型转换,例如:

type height int
h := height(170)
step := 2
// fmt.Println(h + step) // 错误的操作 h + step
// invalid operation: a + step (mismatched types height and int)
// 类型转换,int(h) 将 h 转换为 int 类型
fmt.Println(int(h) + step) // 32
1
2
3
4
5
6
7

基础类型 Underlying type

任何类型都有个基础类型,预声明的布尔、数值和字符串类型,以及类型字面量的基础类型为类型本身,其他类型的基础类型为其类型声明中所依据类型的基础类型。例如:

// 预声明类型和类型字面量, 基础类类型为其本身
bool	// bool
int		// int
float64	// float64
string	// string
[3]int	// [3]int
[]int	// []int
map[string]int	// map[string]int

// 声明类型
type T1 string // T1 的基础类型为 string
type T2 = string // T2 的基础类型为 string
[]T1 // 类型字面量,基础类型为 []T1
type T3 []T1 // T3 的基础类型为 []T1 
1
2
3
4
5
6
7
8
9
10
11
12
13
14

基础类型的作用主要体现在类型转换和变量赋值上。

类型转换

类型对照表

类型 零值 值 or 引用 支持运算
整型 0 算术、递增递减、位、比较排序
浮点型 0 算术、递增递减、比较排序
布尔型 false 比较
字符串型 "" 连接、比较排序
数组型 每个元素为类型零值 索引,比较、for-range
切片型 nil 引用 索引,比较、for-range、append()、切片
映射表型 nil 引用 索引、for-range、delete()
结构体型 每个字段为类型零值 字段、比较