Go 类型系统

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,且 fT 的一个字段或方法;如果 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值