go语言基本语法 (5)

数据比较大的话就传指针,通过内存地址就能找到变量

通道的操作 接收 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并发机制

sBybxvS8YGe5p72

Cy5PwcFDXZfx7tH

go通过os.Exit实现返回状态

测试方法名以Test开头

lI6ho81ASUYFMze

go不支持隐式类型转换,同时不支持指针的运算

用==比较数组

相同维数且含有相同个数元素的数组才可以比较

每个元素都相同的才相等

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxfxy.html