成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這三個 Go 水平自測題,手寫不出來還是先老實上班吧

開發 前端
利用 select+chan+defualt 的方式,很容易實現 TryLock、TryLockWithTimeout 的功能。具體來說就是,在 select 語句中,我們可以使用 default 實現 TryLock,再加一個 Timer 來實現 Timeout 的功能。

現在技術文章特別卷,啥啥底層都能給你分析的頭頭是道,但是分析的對不對要看作者水平,很有可能一個錯,抄他的那些人也跟著錯,因為我以前看源碼的時候就經常感覺自己在兩種狀態下切換:懂了 / 娘咧漏看了,這個函數干啥的。

八股文這個事兒,其實也特別考驗面試官,如果只會一味的問八股文,那也只能說你正巧比面試的人多看點八股,并不能彰顯你多有水平,換個小年輕當面試官人家也能干啊。

最近跟以前的老同事聊,他說了個他特別愛問的面試題,我覺得還是挺有水平的,既能引導候選人循序漸進地展開思維,又能考察基礎和動手能力。

PS:老哥是83年的,以前在一個廣告平臺公司 C++,Java,安卓啥的都干過,之前當過我領導,就是他讓我剛來公司兩星期就去會議室封閉參與用 Go 重構項目的,算是硬逼著我學了學 Go。

老哥說:Go 當初吸引人的地方不就是并發、Channel 這些嘛,其實用過后你會發現也就那樣,宣傳的有點過了,但是既然平時用 Go 開發,這塊就一定得過關,那怎么并發和 Channel 都考察到呢?我一般會問:"Channel 和 并發掌握的熟練吧(一般沒人會說不熟)那咱們先用 Channel 實現一個互斥鎖",嘿,說你呢,實現一下。

我心想這題我面試別人用過,我背過……,還能難倒我:先初始化一個 capacity 等于 1 的 Channel,它的“空槽”代表鎖,哪個協程能成功地把元素發送到這個 Channel,誰就獲取了這把鎖,給你上代碼:

// 使用chan實現互斥鎖
type Mutex struct {
ch chan struct{}
}

// 使用鎖需要初始化
func NewMutex() *Mutex {
mu := &Mutex{make(chan struct{}, 1)}
mu.ch <- struct{}{}
return mu
}

// 請求鎖,直到獲取到
func (m *Mutex) Lock() {
<-m.ch
}

// 解鎖
func (m *Mutex) Unlock() {
select {
case m.ch <- struct{}{}:
default:
panic("unlock of unlocked mutex")
}
}

老哥說:只要不是太混,這個道題都能答出來,那么接下來我一般會在這道題的基礎上兩個變種,首先讓候選人再擴展一下給這個鎖實現 TryLock 功能,TryLock 知道吧,你不是寫過兩年Java,這個用過吧,你在剛才的基礎上實現一下。

我心想:我現在偶爾寫Java 的時候都是把以前做的那些項目代碼翻出來抄抄,我哪能記得這么清楚,不過這個不就是嘗試獲取鎖,獲取不到返回 false 嘛。

這里再給大家解釋一下 TryLock 這個功能,下面這段話我從JavaDoc 里抄的:

tryLock() - 可輪詢獲取鎖。如果成功,則返回 true;如果失敗,則返回 false。也就是說,這個方法無論成敗都會立即返回,獲取不到鎖(鎖已被其他線程獲取)時不會一直等待。

那這個也難不倒我啊,咱們學 Channel 的時候,都要學會利用 select+chan+default 的方式,避免程序阻塞住嘛,那我就套一下這個公式唄。(不過我老不寫這個,語法我給忘了,多虧GoLand 提示我半天我才寫出來,面試的時候一般在紙上寫,咱們讀者到時候記得貝貝哈)

// 嘗試獲取鎖
func (m *Mutex) TryLock() bool {
select {
case <-m.ch:
return true
default:
}
return false
}

老哥:嗯,確實是這么個解法,不過你這寫的也太慢了,算你過吧,其實我直接寫估計也寫不出來,天天開會手都生了。那好,這個變種如果能答出來,證明這個候選人基礎應該還可以,Channel 使用這塊應該都沒啥問題,那這會兒我就會再擴展一下,讓候選人再實現下 TryLock 的重載方法,就是可以設置超時時間那個重載函數,考察一下他定時器這塊的知識過不過關,誒,我怎么把答案給說出來了,你懂我意思吧。

老哥的意思就是實現一下 TryWithTimeout,Java 里鎖的 Try Lock 還有個重載方法:

tryLock(long, TimeUnit) - 可定時獲取鎖。和 tryLock() 類似,區別僅在于這個方法在獲取不到鎖時會等待一定的時間,在時間期限之內如果還獲取不到鎖,就返回 false。如果如果一開始拿到鎖或者在等待期間內拿到了鎖,則返回 true。

因為 Go 里邊沒有重載方法這種機制咱們就只能寫個 TryWithTimeout 方法啦,剛才說了用定時器能實現,不過這塊我也忘了怎么用了…...只好默默打開的了瀏覽器搜索,最后實現答案版本如下:

// 加入一個超時的設置
func (m *Mutex) LockTimeout(timeout time.Duration) bool {
timer := time.NewTimer(timeout)
select {
case <-m.ch:
timer.Stop()
return true
case <-timer.C:
}
return false
}

最后老哥看了看:嗯,看著挺像那么回事的,今天家里領導有事,我得趕緊接二公主放學了,下回再聊吧。

平時我們實際應用時最好不要用 Channel 替代sync.Mutex,但是用 Channel 確實除了實現互斥鎖的功能外,還能擴充出TryLocK和LockTimeout這些擴展功能。

利用 select+chan+defualt? 的方式,很容易實現 TryLock、TryLockWithTimeout? 的功能。具體來說就是,在 select? 語句中,我們可以使用 default? 實現 TryLock?,再加一個 Timer? 來實現 Timeout 的功能。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2023-10-26 07:29:06

mongodb十六進制ID

2025-06-30 07:35:00

遠程訪問NAT內網穿透

2011-04-28 10:32:02

PHP自測

2010-08-17 22:20:20

HCNE網絡工程師

2010-08-17 22:32:57

HCNE網絡工程師

2010-08-17 22:51:02

HCNE網絡工程師

2023-02-07 13:51:11

SQLupdate語句

2021-02-06 12:28:53

低代碼開發者數字化

2021-04-16 09:17:39

機器學習人工智能AI

2018-04-28 11:03:58

2017-01-06 10:07:39

Linuxwindowsatime

2017-11-02 13:15:18

Linux

2023-11-07 08:36:34

JavaScriptJS挑戰

2022-03-30 14:19:36

云安全云計算風險

2015-09-23 09:48:04

2021-10-15 08:32:03

RocketMQ數據結構架構

2020-05-29 10:18:58

python開發代碼

2022-06-01 11:52:42

網站客戶端網絡

2020-10-09 11:30:07

Redis緩存數據庫

2021-03-30 15:10:50

Java序列化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品欧美一区二区在线观看视频 | 国产精品久久久久久久久免费软件 | 久久综合一区 | 正在播放一区二区 | 97在线播放| 九九热国产精品视频 | 福利视频一二区 | 午夜影院在线 | 免费成人高清在线视频 | 亚洲黄色国产 | 欧美性video| 国产精品一区二区免费看 | 久久久久国产精品 | 国产日韩欧美激情 | 男人天堂免费在线 | 久久亚洲国产 | 亚洲国产专区 | 91精品国产91久久久久久 | 久久综合欧美 | 狠狠爱免费视频 | 欧美精品久久久 | 亚洲伊人久久综合 | 羞视频在线观看 | 九九亚洲精品 | 亚洲国产专区 | 少妇精品久久久久久久久久 | 不用播放器看的av | 日韩欧美不卡 | 国产精品区二区三区日本 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 久久国| 成人国产在线观看 | 在线观看国产视频 | 色婷婷久久久亚洲一区二区三区 | 国产精品高潮呻吟久久久久 | 欧美在线免费 | 精品久久久久国产免费第一页 | 欧美啪啪| 欧美精品久久久 | 天天夜碰日日摸日日澡 | 亚洲黄色网址视频 |