数据比较大的话就传指针,通过内存地址就能找到变量
通道的操作 接收 x := <- ch // 从ch中接收值并赋值给变量x <- ch // 从ch中接收值,忽略结果 关闭 var once Sync.Once // 只接受没有参数没有返回值的函数 once.Do() // 遇到有函数有参数和返回值的时候,可以用闭包函数 Sync.Map注意:内置的map不是并发安全的(超过20个goroutine操作内置的map就会报错)
使用是一个开箱即用的,不需要初始化。
var syncMap sync.Map // 原来的写法 // syncMap[key] = value syncMap.Store(key, value) syncMap.Load(key) syncMpa.LoadOrStore() syncMap.Delete() syncMap.Range() 原子操作针对基本数据类型我们还可以使用原子操作来保证并发安全,因为原子操作是Go语言提供的方法它在用户态就可以完成,因此性能比加锁操作更好。Go语言中原子操作由内置的标准库sync/atomic提供。
注意:如果一个方法用了指针接收者,剩下的方法都应该用指针接收者
锁sync.Mutex
是一个结构体,结构体是值类型,给函数传参要传指针。
![image-20200414215321055](/Users/liuhuan/Library/Application Support/typora-user-images/image-20200414215321055.png)
![image-20200414220723657](/Users/liuhuan/Library/Application Support/typora-user-images/image-20200414220723657.png)
![image-20200415214835119](/Users/liuhuan/Library/Application Support/typora-user-images/image-20200415214835119.png)
context统一goroutine任务调度的通知格式。
![image-20200420110723891](/Users/liuhuan/Library/Application Support/typora-user-images/image-20200420110723891.png)
优势在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。
单元测试 proof调试工具go语言内置的调试工具,分析性能,资源占用等
链表闭环![image-20200417084714750](/Users/liuhuan/Library/Application Support/typora-user-images/image-20200417084714750.png)
数据库 var db *sql.DB type User struct { id int name string age int } func initDB(){ } func main(){ err := initDB() if err != niu { fmt.Printf("init db failed, err:%v\n", err) } fmt.Pirntln("连接成功") var u1 user sqlStr := `select id, name, age from user where id=?` // 1就是id后面的那个问号的值,QueryRow就是从连接池里取出数据库查询单条记录 rowObj := db.QueryRow(sqlStr, 1) // 拿到rowObj对象,必须调用该对象的Scan方法,因为该方法会释放数据库链接 rowObj.Scan(&u1.id, &u1.name, &u1.age) fmt.Printf("u1:%#v\n", u1) } MySQL预处理普通SQL语句执行过程:
客户端对SQL语句进行占位符替换得到完整的SQL语句。
客户端发送完整SQL语句到MySQL服务端
MySQL服务端执行完整的SQL语句并将结果返回给客户端。
预处理执行过程:
把SQL语句分成两部分,命令部分与数据部分。
先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预处理。
然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换。
MySQL服务端执行完整的SQL语句并将结果返回给客户端。
为什么要预处理?优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编译多次执行,节省后续编译的成本。
避免SQL注入问题。
kafka 服务注册发现 etcd使用etcd下的watch函数,可以监控数据发生改变时的操作,可以使用该方法,实现在不用重启服务的情况下,当配置文件发生修改时,自动重新加载配置文件的功能。
Raft协议etcd的watch
watch底层是如何实现发送课程的
go csp并发机制go通过os.Exit实现返回状态
测试方法名以Test开头
go不支持隐式类型转换,同时不支持指针的运算
用==比较数组
相同维数且含有相同个数元素的数组才可以比较
每个元素都相同的才相等