您好,登錄后才能下訂單哦!
Go語言中Once如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
sync.Once是sync包中的一個對象,它只有一個方法Do,這個方法很特殊,在程序運行過程中,無論被多少次調用,只會執(zhí)行一次。
1.適用場景:
在一個進程之中,如果一個函數里面的一部分代碼,希望在很多協(xié)程都執(zhí)行的時候,只被執(zhí)行一次,那么Once便起到了作用。例如:初始化進程中的共享內存,它只希望被該進程初始化一次,其他協(xié)程不需要初始化操作。
例子:
結果分析:
從上面的輸出結果可以看出,使用了once.Do之后,onceBody()函數中的代碼只被調用了一次。其他的協(xié)程依然還在運行,但是并沒有去執(zhí)行onceBody()函數中的代碼。
2. 源碼如下所示:
Once的數據結構和函數實現如下所示:
備注:巧妙之處,doSlow函數中,計數器done的自增操作是寫到了defer函數中,原因就是defer中的函數就算在panic的時候,也會被執(zhí)行,這樣就可以有效的避免panic的時候,Do函數的計數器失效,導致其他的協(xié)程會在調用一次f()中的代碼。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。