1. 数据类型的分类
2. 复合类型
- 数组
- 结构体
- 支持比较(但如果成员含有不可比较的类型,则不能进行比较)
- 结构体可以实现面向对象,序列化,继承
- 也只值类型。默认是值传递
3. 引用类型
3.1 指针
- 所有的值类型都有对应的指针
- 所有的引用类型也都有其指针,但是这个意义就不是很大(类似指针的指针)
- new(T):为T类型分配空间,并返回T类型的指针。一般用于对基本类型的指针的初始化
- make(T):用于内存分配,只用于slice,map,chan的内存创建(初始化),返回的是引用本身
3.2 切片
- 引用类型,内部结构包括底层数组指针,长度,容量
- make([]T,size,cap)
- len(s)==0:判断切片是否为空
- s==nil:判断切片是否未初始化
- func append(slice []Type, elems ...Type) []Type:切片的追加
- func copy(dst []Type, src []Type) int:切片的复制
- a = append(a[:index], a[index+1:]...):没有专门的删除方法,可以通过这个语句来实现
3.3 map
- 引用类型,必须初始化之后才能使用
- make(map[KeyType]ValueType, [cap])
- func delete(m map[Type]Type1, key Type)
- map也不可比较
3.4 函数
- 函数也是一种引用类型
- type calculation func(int, int) int:定义一个函数类型
- 函数类型的变量只能通过赋值进行初始化
3.5 通道
- 引用类型,必须初始化之后才能使用
- channel支持==,如果两个channel引用同一个对象,则返回为true
- 通道需要通过make初始化 : ch:=make(chan int)
- 管道有点像java的阻塞队列
- 没有使用协程的情况下,如果channel数据取完了,再取就会包deadlock
- 声明管道时,可以约束为只读或只写,但只是起到编译器检查的作用(一般用于函数形参处)
- var chan1 chan<- int:声明只写管道
- var chan2 <-chan int:声明只读管道
4. 接口类型
type 接口类型名 interface{
方法名1( 参数列表1 ) 返回值列表1
方法名2( 参数列表2 ) 返回值列表2
…
}
- var 接口变量名 接口类型名:声明一个接口类型的变量
- 当值接受者实现接口时:无论是结构体还是结构体指针都可以赋值给接口变量,Go语言中有对指针类型变量求值的语法糖
type Mover interface {
move()
}
type dog struct {}
func (d dog) move() {
fmt.Println("狗会动")
}
func main() {
var x Mover
var wangcai = dog{} // 旺财是dog类型
x = wangcai // x可以接收dog类型
var fugui = &dog{} // 富贵是*dog类型
x = fugui // x可以接收*dog类型
x.move()
}
- 当指针接受者实现接口时:只能将结构体指针赋值给接口变量
type Mover interface {
move()
}
type dog struct {}
func (d *dog) move() {
fmt.Println("狗会动")
}
func main() {
var x Mover
var wangcai = dog{} // 旺财是dog类型
x = wangcai // x不可以接收dog类型
var fugui = &dog{} // 富贵是*dog类型
x = fugui // x可以接收*dog类型
}
- v,ok:=x.(T):断言函数(同时实现类型转换),判断接口x是否为T类型的实例