sync.Mutex1.sync.Mutex 为互斥锁,适用于读写不确定,并且只有一个读或者写的场景。2.在一个 goroutine 获得互斥锁后,其他 goroutine 只能等待释放该互斥锁。3.在同一个 goroutine 中的  sync.Mutex 解锁之前再次进行加锁,会导致死锁。4.Lock() 加锁后不能再继续对其加锁,会阻塞直到 Unlock() 解锁后才能加锁。5.在没有锁的情况下解锁会导致 panic 错误。package mainimport&
接口值由两个部分组成,一个具体的类型和那个类型的值,它们被称为接口的动态类型和动态值。当且仅当接口的动态值和动态类型都为 nil 时,接口类型值才为 nil 。案例说明package mainimport "fmt"type Service interface {    Name()}type MySql struct{}fun
append// 将元素追加到切片的末尾。 如果原切片具有足够的容量,它将追加元素到切片的末尾。 如果没有,将分配一个新的底层数组来追加新元素并返回新的切片,因此要将追加后切片重新赋值给原切片变量:// slice = append(slice, elem1, elem2)// slice = append(slice, anotherSlice...)//&nbs
需要说明 2 点1. return 的执行包含两步:    第一步给返回值赋值,匿名返回值先在此声明再赋值,而有名返回值是函数声明时声明的,在此直接赋值;    第二步调用 RET 返回指令并传入返回值,在执行 RET 返回指令时会先检查是否存在 defer 语句 ,若存在则按“先进后出”依次执行,再将返回值带出退出函数2. defer 声明时会先确定参数的值,defer 推迟执行的仅是其函数体package&nbs
单元测试编写原则测试文件必须以 _test.go 结尾。测试文件包名要和被测试函数所在包一致。必须引入 testing 包。单元测试函数必须以 Test 开头。使用案例函数必须以 Example 开头,且有预期 Output 注释。基准测试函数必须以 Benchmark 开头。常用测试命令# 单元测试go test \    -v \ # 显示详细信息   
关键字 iota 用来声明枚举 ,默认开始值为 0 ,const 中每增加一行加 1 。package mainimport "fmt"const (    a = iota   // a = 0    _     
今年 6 月中旬公司团建去了江西吉安革命圣地——井冈山清晨出发时遇见的小蜗牛在这红色教育基地,处处可见革命先辈们留下印记,时刻提醒着我们要珍惜今日来之不易安定生活。在毛泽东故居后的两棵神奇古树井冈山革命博物馆俯瞰黄洋界,作为一个长居北方的山东yǐn(人),每每领略南方秀美山川之时,心情便是一阵激动。井冈山烈士陵园龙潭井冈山红军造币厂的工字银元
多表连接JOIN 语句应尽可能减少 NestedLoop 次数,即永远用小结果集驱动大结果集;优先优化 NestedLoop 内层循环;保证 JOIN 语句中被驱动表上的条件字段已经被索引;不能保证 JOIN 语句中被驱动表上的条件字段已经被索引且内存资源充足的情况下可以加大 JOIN BUFFER 的设置。双表连接左连接时给右表条件字段加索引,右连接时给左表条件字段加索引。EXPLAIN SELECT * FROM `member` `m`&n