0%

Go语言

Go语言

编程细节

  • type 相关的定义可以抽到 xxx/types 的目录下,好处是可以避免循环引用
  • client 尽量复用,防止开了很多个客户端没有关闭导致 goroutine 数量暴涨
  • json.rawMessage 适用于根据情况如 type 来解结构体的情况
  • 结构体作为数据库 Model 时字段要大写,并且要与数据库中对应字段一致
  • 方便单测的编程技巧 https://juejin.im/post/5ce93447e51d45775746b8b0

工具

go-lint

基础

基础数据结构

String

string是不可变的,不能更改,故两个副本共享string的内存是安全的,s[:n]的代价也很低

编码

UTF-8 通过第一个字节开头的1来标示需要用到多少个字节

image-20200722233914366

Strings bytes strconv unicode 包提供处理字符串的函数

string 操作开销较大,可以使用 bytes.Buffer

复杂类型

Arrays

数组相当于一个固定量而非指针,所以复制传值的开销过大,切片就是解决方案

Slice

https://halfrost.com/go_slice/

Maps

image-20200724171706774

函数

Panic 和 Recover

Panic 会依次(先进先出)调用本协程的 defer() 后退出程序

Recover 会捕捉处理 panic,可以处理本协程的 panic,保证程序不会挂掉

函数引用

函数参数为值的时候传值和传指针都可以,因为 go 会将指针转换为值

Goroutines 和 Channels

异步(有缓冲区)的 Channel 用完要 close,不然会阻塞,形成死锁