GO笔记

1.切片引用问题

1
2
3
4
a := []int{1,2}
a = a[:1]
a[1] = 9
fmt.Println(a)

❌:panic: runtime error: index out of range [1] with length 1

2.图的表示

  • 邻接矩阵
  • 邻接表

3.make & new

  • make 的作用是初始化内置的数据结构,如map、slice、channel
  • new 的作用是根据传入的类型分配一片内存空间并返回指向这片内存空间的指针

通常使用make 初始化一以下三种基本类型:

1
2
3
slice := make([]int, 0, 100)
hash := make(map[int]bool, 10)
ch := make(chan int, 5)

与make 相比,new 的功能就很简单了,它只能接收一个类型作为参数然后返回一个指向该类型的指针:

1
2
3
4
5
i := new(int)

var v int
i := &v
以上两种对i的初始化方式等价,它们都会创建一个指向 int 零值的指针

4.GO并发编程

(1)runtime包

  • runtime.Gosched()

    让出CPU时间片,重新等待安排任务

  • runtime.Goexit()

    退出当前协程

  • runtime.GOMAXPROCS

​ Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码。默认值是机器上的CPU核心数。

(2)sync包

  • sync.WaitGroup 等待组,实现并发任务的同步

    方法 功能
    Add(delta int) 计数器+delta
    Done() 计数器-1
    Wait() 阻塞直到计数器变为0
  • sync.Once (进阶)只执行一次,加载配置

  • sync.Map 并发安全的map,开箱即用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var m = sync.Map{}

    func main() {
    wg := sync.WaitGroup{}
    for i := 0; i < 20; i++ {
    wg.Add(1)
    go func(n int) {
    key := strconv.Itoa(n)
    m.Store(key, n)
    value, _ := m.Load(key)
    fmt.Printf("k=:%v,v:=%v\n", key, value)
    wg.Done()
    }(i)
    }
    wg.Wait()
    }
  • sync.Mutex 互斥锁

  • sync.RWMutex 读写互斥锁,读写锁非常适合读多写少的场景

    (3)select 多路复用

    (4)协程、进程、线程