1、Go 的并发原则非常优秀,目标就是简单:尽量使用 channel;把 Goroutine 当作免费的资源,随便用。

2、Go 的并发编程模型用 Goroutine 和 Channel 来替代。Goroutine 和线程类似,Channel 和 Mutex 类似。

3、Channel 的发送和接收操作本质上都是 “值的拷贝”。

4、Go 的理念:用通信来共享内存。与其让多个 Goroutine 争抢同一块内存,不如让它们各自独立,通过 Channel 把需要的数据传递给对方,核心目的是避免数据竞争。

5、Go 参数传递都是值传递。

6、&和*的区别

  • &是引用,作用于值类型,用于取地址,如果想要传递一个类型的地址避免值拷贝,就可以在前面加一个&表示取该类型的地址,在函数的参数定义时,记得在参数的类型加上*。

  • *是指针,用于标记指针类型,或者对地址进行解引用,例如 var a *int 中,a 为指向 int 类型的地址, 若 p 是的类型是指针,*p 表示地址 p 指向的值。

7、GMP 模型

M,内核线程,操作系统内核其实看不见 G 和 P,只知道自己在执行一个线程。G 和 P 都是在用户空间上的实现。每一个 M 持有一个 P,通过 P 来获取 G。

8、Go 语言在高并发场景应用非常广泛,但是 Go 的数据结构大多数都是线程不安全的,也就是说当多个 groutine 同时操作数据会存在数据竞争的问题,比如 Map、Chan 线程并不安全,解决方案可以加锁也可以用好 channel,本质需要通过 synic.lock 来应对并发问题使其同一时间保证只有一个协程用一份数据。

9、组合优于继承,通过 “结构体嵌入”(Struct Embedding)实现代码复用和功能组合。