![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go
文章平均质量分 63
藓类少女
这个作者很懒,什么都没留下…
展开
-
乐观锁 悲观锁
一、基本概念乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。改变一个数值的三个步骤:①把想修改的数值从某个地方取出来;②在取出来的数值修改为期望值;③把修改后的数值保存到原来的地方。这里面有一个问题,把数值取出来进行修改的时候(做完了①步,正在做②步),如果有另一个过程(进程或线程)对同一个数值进行同样的操作(取值,修改),那么当两个过程都要做③的时候,就肯定有一个过程是白干活的。悲观锁:悲观锁在操作数据时比较悲观,总认为会发生并发问题。如果想修改一个数值,立马给这个数值原创 2021-08-26 15:12:22 · 375 阅读 · 0 评论 -
位运算规则
符号 描述 & 与 | 或 ^ 异或 ~ 取反 << 左移 >> 右移 1. &0 & 0 = 0 0 & 1 = 0 1 & 0 = 01 & 1 = 12. |0 | 0 = 00 | 1 = 1 1 | 0 = 1 1 | 1 = 13. ^相同位异或为0,不同位异或为10 ^ 0 = 0 0 ^ .原创 2021-08-24 17:01:07 · 301 阅读 · 0 评论 -
go 匿名接口作为结构体的属性
以下代码是从sort包提取出来的:package mainimport ( "fmt")type Interface interface { Len() int Less(i, j int) bool Swap(i, j int)}// Array 实现Interface接口type Array []intfunc (arr Array) Len() int { return len(arr)}func (arr Array) Less(原创 2021-08-13 18:05:13 · 1118 阅读 · 0 评论 -
go 闭包的作用
func main(){ ch := make(chan int, 5) for i := 0; i < 5; i++ { go func() { fmt.Println(i) ch <- i }() } time.Sleep(5*time.Second) close(ch) fmt.Println("输出ch内容") for c := range ch { fmt.Println(c) }}运行结果:改为:func main(){ ch原创 2021-08-11 21:48:09 · 726 阅读 · 0 评论 -
go 互斥锁和读写锁
一、互斥锁执行了Lock() 操作后,如果有另外一个 goroutine 又执行了上锁操作,那么该操作被阻塞,直到该互斥锁恢复到解锁状态。func main(){ var mutex sync.Mutex arr := []int{1, 2, 3} go func() { mutex.Lock() fmt.Println("1 locked") arr = append(arr, 4) mutex.Unlock() fmt.Println("1 unlocked") }()原创 2021-08-11 20:35:41 · 141 阅读 · 0 评论 -
protobuf中坑人的2点
protobuf中坑人的2点:1.oneof类型不能通过json反序列化2.最里层的message没有null值,都会被赋该类型的默认值1.oneof类型不能通过json反序列化定义一个这样的protobuf消息:message EnvValue { oneof val { string s = 1; double f = 2; }}生成的go语言代码对应的结构为:type EnvValue struct { // Types that are val..原创 2021-04-14 18:29:26 · 1623 阅读 · 1 评论 -
go协程之间的执行顺序以及和主协程的执行顺序
package mainimport( "fmt" )func main(){ ch := make(chan int, 2) fmt.Println(<-ch) go func(){ ch <- 1 }() }原创 2021-03-22 19:22:01 · 4314 阅读 · 0 评论