new和make的区别
- new 的作用是初始化一个指向类型的指针(*T),使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。返回值是 指向这个新分配的零值的指针。
- make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。
- make函数的目的与new不同。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是*T)的一个初始化的(不是零值)的实例
数组与切片的区别
- 数组 数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。 数组的长度是数组类型的一部分,所以[3]int 和 [4]int 是两种不同的数组类型,数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变
- 数组是值传递,作为方法的参数传入时将复制一份数组而不是引用同一指针
- 切片 切片表示一个拥有相同类型元素的可变长度的序列。有三个属性:指针,长度和容量,切片不需要指定大小,切片是地址传递。切片可以通过数组来初始化,也可以通过内置函数make()初始化 .初始化时len=cap
Go 协程
- 只需要在函数调用前添加go关键字即可实现go的协程,创建并发任务
- 关键字go并非执行并发任务,而是创建一个并发任务单元
Go 高级for循环
- 循环嵌套的操作,在循环外使用label标记退出哪一层循环的方式。
- 支持使用平行赋值的方式来初始化多个变量
I:
for i := 0; i < 2; i++ {
for j := 0; j < 5; j++ {
if j == 2 {
break I
}
fmt.Println("hello")
}
fmt.Println("hi")
}
Go switch语句
- 单个case中,可以出现多个结果选项
- 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case
go语言中没有隐藏的this指针
- 方法施加的对象显式传递,没有被隐藏起来
- golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达
- 方法施加的对象不需要非得是指针
Go指针运算
Go main函数
Go语言同步锁
Go channel
- 给nil channel 发送数据,阻塞
- 从nil channel 读数去,阻塞
- 关闭的channel 发数据,panic
- 关闭的channel接收数据,缓冲区无数据,返回一个零值
- 无缓存的channel是同步的,有缓冲channel是非同步的
Go for range
- for range创建了每个元素的副本,而不是直接返回每个元素的引用,如果使用该值变量的地址作为指向每个元素的指针,就会导致错误,在迭代时,返回的变量是一个迭代过程中根据切片依次赋值的新变量,所以值的地址总是相同的,导致结果不如预期
- 遍历特殊元素数组时建议使用普通循环方式
Go interface 结构
Go的interface的Duck-typing机制
其他
- 对象和对象指针在golang中的微妙处理,golang可以自动将对数据类型定义的方法抓转换成对数据类型指针定义的方法。但不能自动的将对数据类型指针的方法转换为对数据类型定义的方法
Golang Slice 底层结构
Golang slice扩容机制
- 创建一个有长度的切片时,容量为长度的两倍
- 无长度的切片,初始化长度和容量都为0
- 旧容量 小于1024时,容量翻倍
- 容量大于1024时,每次涨旧容量的四分之一
Golang 参数传递
- Golang所有的参数传递都是值传递,都是一个副本一个拷贝
Golang 引用类型
Golang 接口接收规则
- 实体类型实现接口,实体类型和指针都实现了接口
- 实体类型的指针实现接口,则只有指针可以调用方法
Golang context