golang 大杂烩
主协程如何等其余协程完再操作
- 主协程自我阻塞,直到需要的协程完成
- 阻塞方法
- 使用sync.WaitGroup()管理其余协程
- 优点:操作简单
- 缺点:不能管控协程的执行完成的顺序
- 利用缓存管道进行协程之间的通信
- 优点:能够管控一组协程结束
- 缺点:不能管控协程的执行完成顺序
- 利用无缓存管道进行协程之间的通信
- 优点:能够管控协程执行完成的顺序
- 使用sync.WaitGroup()管理其余协程
slice基本的底层原理的学习
-
slice的本质:结构体
type slice struct { array unsafe.Pointer // 元素指针 len int // 长度 cap int // 容量 }
-
底层数据修改的影响情况
- 在一个已存在的切片的基础上,截取数据(还是切片类型)。在没有超过容量的基础上,增加数据和修改数据都会影响到原先的切片元素的值
- 做形参传递给函数时,只要slice[i]修改元素值得时候,会影响到底层数据
-
参考代码
package main
import(
"fmt"
)
func main(){
slice := []int{0,1,2,3,4,5,6,7,8,9}
s1 := slice[2:5] //切出来的数据,还是底层数据:slice
s2 := s1[2:6:7] //2,6,7都是索引值,切出来的数据,还是底层数据:slice
fmt.Println("s1:",s1,len(s1),cap(s1))
fmt.Println("s2:",s2,len(s2),cap(s2))
s2 = append(s2,100) // 增加的数据不会超过该切片的容量,会影响到s1和slice切片元素
s2 = append(s2,200) // 增加数据超过该切片的容量,自动复制新的位置,并且容量扩大原来的一倍
fmt.Println("s2:",s2,len(s2),cap(s2))
s1[2] = 20
fmt.Println("s2:",s2)
fmt.Println("s1:",s1)
fmt.Println("Slice:",slice) //下标为4和下标为8的值都被改变了
}
- 输出结果
s1: [2 3 4] 3 8
s2: [4 5 6 7] 4 5
s2: [4 5 6 7 100 200] 6 10
s2: [4 5 6 7 100 200]
s1: [2 3 20]
Slice: [0 1 2 3 20 5 6 7 100 9]
-
内置函数:len和cap
- len求切片的长度
- cap求切片的容量
-
共享:底层数据
-
扩容
- 增加数据超过该切片的容量,自动复制到新的位置,并且容量扩大原来的一倍
-
学习资料:https://juejin.im/post/5ca2b75f51882543ea4b81c8#comment
map学习
- map的输出是无序,因为key的值是遵循hash排序的
- 要做到顺序,可以对键值进行排序
大文件排序
- 比较优化的算法:外排
- 将大文件分为很多个小文件
- 对小文件内容进行排序
- 同时遍历所有的小文件,找到最小数或者最大数进行
- 取出最大数或者最小数,存储,再次遍历。直到遍历完所有的小文件中的数据
HTTP中GET和HEAD请求的区别
- GET请求
- GET请求带上传输消息主体
- 作用
- 传输数据给客户端
- HEAD请求
- HEAD请求不带上传输消息主体
- 作用
- 用来查看超文本链接有效性,可访问性
- 参考博文:HTTP GET HEAD
http Keep Active
- Keep Active模式定义
- 客户端和服务端建立连接之后,保持连接
- 客户端判断服务端发送数据
- 客户端根据响应头中的Content-length的值,是否已经接收完数据
- 当服务端不知道数据量多大的时候,响应头中使用Transfer-Encoding头字段,值为chunk。将数据分块发送给客户端,由一个长度为o的chunk标明结束
- 参考博文:HTTP Keep-Alive模式