GO原子操作(3)atomic.Value

為了擴大原子操作的適用范圍舰涌,Go語言在1.4版本發(fā)布的時候向sync/atomic包中添加了一個新的類型Value帮辟。此類型的值相當(dāng)于一個容器凝颇,可以被用來“原子地”存儲和加載任意的值婶芭。
atomic.Value類型是開箱即用的纤勒,我們聲明一個該類型的變量(以下簡稱原子變量)之后就可以直接使用了牢裳。這個類型使用起來很簡單逢防,它只有兩個指針方法——Store和Load。不過蒲讯,雖然簡單忘朝,但還是有一些值得注意的地方的。

type ifaceWords struct {
    typ  unsafe.Pointer
    data unsafe.Pointer
}

ifaceWords結(jié)構(gòu)體是實際存儲我們的Value值的地方,可以看到,我們存儲的實際是指向Value的type和data的指針.
Store操作有兩種行為模式:
1.First Store : 當(dāng)我們第一次調(diào)用Store的時候,Store函數(shù)會初始化typ指針(需要注意的是,每一個Value在第一次Store之后typ就被確定而不能更改了,否則會panic).
2.后面的每次Store調(diào)用都是直接替換掉data指針

Load函數(shù)檢測typ的值,如果為nil或者正在進行首次調(diào)用Store則會返回nil.否則返回一個interface{}(實際存儲的是ifaceWords值)

使用規(guī)則

第一條規(guī)則判帮,不能用原子值存儲nil
我們不能把nil作為參數(shù)值傳入原子值的Store方法局嘁,否則就會引發(fā)一個panic。
這里要注意晦墙,如果有一個接口類型的變量悦昵,它的動態(tài)值是nil,但動態(tài)類型卻不是nil晌畅,那么它的值就不等于nil但指。這樣一個變量的值是可以被存入原子值的。

第二條規(guī)則抗楔,我們向原子值存儲的第一個值棋凳,決定了它今后能且只能存儲哪一個類型的值
第一次向一個原子值存儲了一個string類型的值,那我在后面就只能用該原子值來存儲字符串了连躏。如果我又想用它存儲結(jié)構(gòu)體剩岳,那么在調(diào)用它的Store方法的時候就會引發(fā)一個panic。這個panic會告訴我入热,這次存儲的值的類型與之前的不一致拍棕。
Value值內(nèi)部是依據(jù)被存儲值的實際類型來做判斷的晓铆,因此想通過接口類型的值,然后再存儲這個接口的某個實現(xiàn)類型的值這樣的方式是不可行的莫湘。

使用建議

1.不要把內(nèi)部使用的原子值暴露給外界尤蒿。比如,聲明一個全局的原子變量并不是一個正確的做法幅垮。這個變量的訪問權(quán)限最起碼也應(yīng)該是包級私有的腰池。
2.如果不得不讓包外,或模塊外的代碼使用你的原子值忙芒,那么可以聲明一個包級私有的原子變量示弓,然后再通過一個或多個公開的函數(shù),讓外界間接地使用到它呵萨。注意奏属,這種情況下不要把原子值傳遞到外界,不論是傳遞原子值本身還是它的指針值潮峦。
3.如果通過某個函數(shù)可以向內(nèi)部的原子值存儲值的話囱皿,那么就應(yīng)該在這個函數(shù)中先判斷被存儲值類型的合法性。若不合法忱嘹,則應(yīng)該直接返回對應(yīng)的錯誤值嘱腥,從而避免panic的發(fā)生。
4.如果可能的話拘悦,我們可以把原子值封裝到一個數(shù)據(jù)類型中齿兔,比如一個結(jié)構(gòu)體類型。這樣础米,我們既可以通過該類型的方法更加安全地存儲值分苇,又可以在該類型中包含可存儲值的合法類型信息。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屁桑,一起剝皮案震驚了整個濱河市医寿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掏颊,老刑警劉巖糟红,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乌叶,居然都是意外死亡盆偿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門准浴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來事扭,“玉大人,你說我怎么就攤上這事乐横∏箝希” “怎么了今野?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長罐农。 經(jīng)常有香客問我条霜,道長,這世上最難降的妖魔是什么涵亏? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任宰睡,我火速辦了婚禮,結(jié)果婚禮上气筋,老公的妹妹穿的比我還像新娘拆内。我一直安慰自己,他們只是感情好宠默,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布麸恍。 她就那樣靜靜地躺著,像睡著了一般搀矫。 火紅的嫁衣襯著肌膚如雪抹沪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天瓤球,我揣著相機與錄音采够,去河邊找鬼。 笑死冰垄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的权她。 我是一名探鬼主播虹茶,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隅要!你這毒婦竟也來了蝴罪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤步清,失蹤者是張志新(化名)和其女友劉穎要门,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廓啊,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡欢搜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谴轮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒瘟。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖第步,靈堂內(nèi)的尸體忽然破棺而出疮装,到底是詐尸還是另有隱情缘琅,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布廓推,位于F島的核電站刷袍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏樊展。R本人自食惡果不足惜呻纹,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滚局。 院中可真熱鬧居暖,春花似錦、人聲如沸藤肢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘁圈。三九已至省骂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間最住,已是汗流浹背钞澳。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涨缚,地道東北人轧粟。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像脓魏,于是被迫代替她去往敵國和親兰吟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,812評論 0 38
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔茂翔,今天18年5月份再次想寫文章混蔼,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,762評論 2 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,104評論 1 32
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評論 0 9
  • 一個個理論名詞術(shù)語珊燎,把我的腦袋搞暈了惭嚣。果真是太費腦子的不接地氣的一概記不住。我能記住的都是自己直接和間接學(xué)習(xí)的悔政,所...
    嗷嗷嗚tiger閱讀 324評論 0 0