- 基础类型
- 数字,字符串,布尔型
- 复合类型
- 数组,结构体 通过组合简单类型
- 引用类型
- 指针,切片,字典,函数,通道
- 接口类型
- 接口
- 数组
- 支持比较
- 容量也是类型的一部分
- 是值类型
- 结构体
- 支持比较(但如果成员含有不可比较的类型,则不能进行比较)
- 结构体可以实现面向对象,序列化,继承
- 也只值类型。默认是值传递
- 所有的值类型都有对应的指针
- 所有的引用类型也都有其指针,但是这个意义就不是很大(类似指针的指针)
- new(T):为T类型分配空间,并返回T类型的指针。一般用于对基本类型的指针的初始化
- make(T):用于内存分配,只用于slice,map,chan的内存创建(初始化),返回的是引用本身
- 引用类型,内部结构包括底层数组指针,长度,容量
- 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:]...):没有专门的删除方法,可以通过这个语句来实现
- 引用类型,必须初始化之后才能使用
- make(map[KeyType]ValueType, [cap])
- func delete(m map[Type]Type1, key Type)
- map也不可比较
- 函数也是一种引用类型
- type calculation func(int, int) int:定义一个函数类型
- 函数类型的变量只能通过赋值进行初始化
- 引用类型,必须初始化之后才能使用
- channel支持==,如果两个channel引用同一个对象,则返回为true
- 通道需要通过make初始化 : ch:=make(chan int)
- 管道有点像java的阻塞队列
- 没有使用协程的情况下,如果channel数据取完了,再取就会包deadlock
- 声明管道时,可以约束为只读或只写,但只是起到编译器检查的作用(一般用于函数形参处)
- var chan1 chan<- int:声明只写管道
- var chan2 <-chan int:声明只读管道
- 任何类型都实现了空接口
- 接口的定义
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类型的实例
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)