golang 大杂烩

主协程如何等其余协程完再操作

  • 主协程自我阻塞,直到需要的协程完成
  • 阻塞方法
    • 使用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模式

你可能感兴趣的:(golang 大杂烩)