1. 类型别名
type Alias = Type
此后,在 Alias
的作用域内,Alias
就是 Type
的别名。如,
type Second = uint32
var t1 Second = 10
var t2 uint32 = 20
var t3 = t1 + t2
2. 类型定义
type NewType Type
NewType
是一个新的类型,称为 defined type,它不同于任何类型,包括 Type
。如,
type Second uint32
var t1 Second = 10
var t2 uint32 = 20
var t3 = t1 + t2 // 不行!Second 和 uint32 是不同的类型!
又如,
type TreeNode struct {
left, right *TreeNode
data int
}
3. 方法集
每一个类型都有一个关联的方法集:
- 接口类型的方法集就是接口本身;
- 类型
T
的方法集包括所有以T
作为接收器类型的方法; - 类型
*T
的方法集包括所有以T
或*T
作为接收器类型的方法; - 结构体的方法集见下面。
假设有一个类型 T
和接口类型 I
,如果 T
的方法集是 I
的超集,则 T
实现了接口 I
。
4. 结构体类型
如果一个结构体字段只有类型而没有名字,则称为 嵌入字段。
嵌入字段必须指定为类型名 T
或 *T
,然后其非限定类型名将充当字段名。如,
type Example struct {
T1 // field name is T1
*T2 // field name is T2
P.T3 // field name is T3
*P.T4 // field name is T4
}
假设 x
是一个结构体实例,它有一个嵌入字段 T
,且 f
是 T
的一个字段或方法;如果 x.f
是一个合法的选择器,则 f
会被 提升,即可以通过 x.f
来访问 f
,而无需通过 x.T.f
来访问。如,
type A struct {
f int
}
type B struct {
A
}
func main() {
b := B {
A {f: 1},
}
// 都可以
fmt.Println(b.f)
fmt.Println(b.A.f)
}
对于结构体 S
和 defined type T
来说,被提升的方法将按如下规则被包含进结构体的方法集中:
-
如果
S
包含嵌入字段T
,则,S
和*S
的方法集包含所有以T
作为接收器类型的被提升的方法;*S
方法集还包含所有以*T
作为接收器类型的被提升的方法;
-
如果
S
包含嵌入字段*T
,则S
和*S
的方法集包含所有以T
或*T
作为接收器类型的被提升的方法。
5. 其他类型
bool // 布尔类型
// 整数类型
uint8, uint16, uint32, uint64
int8, int16, int32, int64
byte // uint8 的别名
rune // int32 的别名
uint, int // 32 或 64 位,取决于实现
uintptr // 能够存储指针的无符号类型
float32, float64 // 浮点数类型
complex64, complex128 // 复数类型
string // 字符串类型
数组类型:
[ArrayLength] ElementType
其中,ArrayLength
需是非负的整数常量(int
类型)。如,
var array [4]int
array[0] = 1
fmt.Println(array)
切片类型:
[] ElementType
如,
var slice []int = make([]int, 4, 16)
fmt.Println(slice)
指针类型:
*BaseType
如,
i := 1
var p *int = &i
*p += 10
fmt.Println(*p)
函数类型:
func Signature
如,
func add(a, b int) int {
return a + b
}
func main() {
var f func(int, int) int = add
fmt.Println(f(1, 2))
}
接口类型:
interface {
Methods | Interfaces
}
如,
type Reader interface {
Read(p []byte) (n int, err error)
Close() error
}
type Writer interface {
Write(p []byte) (n int, err error)
Close() error
}
// ReadWriter's methods are Read, Write, and Close.
type ReadWriter interface {
Reader // includes methods of Reader in ReadWriter's method set
Writer // includes methods of Writer in ReadWriter's method set
}
map 类型:
map[KeyType]ElementType
如,
var m map[int]string = make(map[int]string, 4)
m[1] = "One"
fmt.Println(m[1])
channel 类型:
chan | <-chan | chan<- ElementType
如,
var ch chan int = make(chan int, 100)
ch <- 10