当前位置:首页 > 技术知识 > 正文内容

大厂 Go 编程规范(二):mutex(编程大厂是什么意思)

maynowei2周前 (08-03)技术知识10


mutex 是golang 的互斥锁,可以保障在多协程的情况下,数据访问的安全。

1、零值有效

我们并不需要mutex指针

mu := new(sync.Mutex)
mu.Lock()

直接可以使用mutex的零值。

var mu sync.Mutex
mu.Lock()

2、mutex可见性

go的map 非线程安全,所以我们经常会通过mutex 给map 加一个锁,大家先看一下第一种方式:

type SMap struct {
  sync.Mutex

  data map[string]string
}
func (m *SMap) Get(k string) string {
  m.Lock()
  defer m.Unlock()

  return m.data[k]
}

然后我们看一下第二种方式

type SMap struct {
  mu sync.Mutex

  data map[string]string
}

func (m *SMap) Get(k string) string {
  m.mu.Lock()
  defer m.mu.Unlock()

  return m.data[k]
}

感觉差别不大,有啥区别?

从封装的角度来看,第二种方法更加优秀。因为第一种方式,SMap 中的mutex 是大写的,意味着,外部可以直接调用 lock 和unlock 方法,破坏了内部封装原则,所以方法二更好。

3、defer更安全

虽然我们可以通过下面的代码,按照需求unlock

p.Lock()
if p.count < 10 {
  p.Unlock()
  return p.count
}

p.count++
newCount := p.count
p.Unlock()

return newCount

但上面的代码存在两个问题,一是如果分支太多很容易导致unlock ,二是可读性较差,到处是unlock。所以更加推荐下面的写法

p.Lock()
defer p.Unlock()

if p.count < 10 {
  return p.count
}

p.count++
return p.count

defer的损耗非常少,大家不必纠结。

相关文章

如何快速将axure生成的原型放到手机上演示

人人都是产品经理旗下【起点学院】推出产品经理“365天”成长计划,BAT大牛带你学产品! 之前Axure官方有一个原型在线分享演示的平台,用户可以直接生成原型到Axure官方平台,方便用户提供演示:h...

苹果编程Objective C与Swift谁更牛?

小鹏大学刚刚毕业,软件开发方面的东西学的不是很多,听好多同学说做iOS开发工资上万是很容易的,踌躇满志,一直想自学iOS开发,可突如其来的一件事让他瞬间迷茫了。时间:2014年9月10日10点地点:某...

Objective-C的本质(objective-c的特点)

我们平时编写的Objective-C代码,底层实现其实都是C\C++代码,所以Objective-C的面向对象都是基于C\C++的数据结构实现的OC对象的本质Objective-C的对象、类主要是基于...

伪装成抖音国际版Tiktok的短信蠕虫

概述近期监测到一款仿冒Tiktok的短信蠕虫,该短信蠕虫最明显的特点就是针对Android系统版本高于6.0以上的设备,由于Android版本的更新迭代,现在大部分设备已经更新到较高的版本,通过不完全...

Xamarin.Android使用教程:列表视图和适配器(2)

昨天我们已经一起学习了第1部分,这是探索Xamarin.Android的列表视图和适配器的的第2部分。在今天的文章中我们将探讨列表视图项排列使用BaseAdapter,还有自定义布局。让我们深入到代码...

webview 渲染机制:硬件加速方式渲染的Android Web

webview 渲染是什么?webview 渲染是用于展现web页面的控件; webview 可以内嵌在移动端,实现前端的混合式开发,大多数混合式开发框架都是基于 webview 模式进行二次开发的w...