-
Go語言高并發時append方法偶現錯誤的解決方法
在實現圖片轉碼的需求時,需要支持最大 500 個圖片下載后轉換格式; 如果是一個一個下載后轉碼,耗時太長,需要使用 goroutine 實現 500 個圖片并發下載后,并發轉碼; 但自測過程中發現,會偶現下載后只轉換了 499 個圖片或更少的情況(全部下載、轉碼成功的條件下); 然后就開始了打印日志找 bug 的過程。 排查問題 因為并發時使用到了 sync 等待全部協程結束,起初以為是 sync 異步等待出了問題; 打印日志發現,正常執行了 500 次下載,執行完成下載之后,繼續執行的轉碼操作…
-
深度解密Go語言之sync.map
工作中,經常會碰到并發讀寫 map 而造成 panic 的情況,為什么在并發讀寫的時候,會 panic 呢?因為在并發讀寫的情況下,map 里的數據會被寫亂,之后就是?Garbage in, garbage out,還不如直接 panic 了。 本文目錄如下: 是什么 Go 語言原生 map 并不是線程安全的,對它進行并發讀寫操作的時候,需要加鎖。而?sync.map?則是一種并發安全的 map,在 Go 1.9 引入。 sync.map?是線程安全的,讀取,插入,刪除也都保持著常數級的時間復雜…
-
淺談 Go 語言代碼注釋問題
每隔一段時間,網上總會突然出現一些令人討厭的帖子,其觀點是:不應該為代碼寫注釋,它存在的唯一原因是因為代碼本身不足夠好。對于這些論點,我完全不能茍同。 爛代碼 他們的觀點也不完全是錯誤的。沒有人能說自己的代碼足夠好。代碼本身也會慢慢變壞。你知道什么時候代碼腐爛得最厲害嗎?當你六個月沒有碰這些代碼的時候! 當回過頭再讀的時候,你會非常好奇:“這個作者到底是怎么想的?”(于是,使用 Git blame 來查看歷史記錄,沒想到代碼竟然是自己寫的,因為這是你的代碼。) 反對注釋者的論點是:需要注釋的唯一…
-
詳述 Golang 的符號表
???本文基于 Go 1.13。 符號表是由編譯器生成和維護的,保存了與程序相關的信息,如函數和全局變量。理解符號表能幫助我們更好地與之交互和利用它。 符號表 Go 編譯的所有二進制文件默認內嵌了符號表。我們來舉一個例子并研究它。下面是代碼: var?AppVersion?string func?main()?{ ?fmt.Println(`Version:?`+AppVersion) } 可以通過命令?nm?來展示符號表;下面是從?OSX?的結果中提取的部分信息: 00000000011772…
-
Golang 中使用 JSON 時如何區分空字段和未設置字段?
Golang 中使用 JSON 時如何區分空字段和未設置字段?
-
JAVA和GO誰更值得學習?
很多公司也開始轉 Go 了,面試官們被迫開始了解 Go。之前沒轉的時候,他們根本不懂 Go,你說你只懂 Go,那誰能面你呢?不嫌棄才怪呢,畢竟候選人這么多,又不差人。而今年除了面試官的轉變,主攻 Go 語言的同學也變多了,Go 和 Java 成為主流。
-
使用Golang開發OpenStack服務的CLI
由于我們需要編寫自己服務的客戶端,之前參考過magnum的python客戶端,編寫過一個,整體感受就是: 一件簡單的事兒,被他封裝的很復雜,而且還有一個關鍵痛點,部署問題:?1.依賴python環境 2. 蹩腳的二進制打包方式。因此,作為一個產品的CLI,以二進制方式交付會帶來諸多方便,比如cloud foundry也用golang重寫了他的客戶端部分。 Cobra簡介 在博客的開篇寫過一篇cobra的博客:?如何使用golang編寫漂亮的命令行工具, 很多流行的CLI都基于這個庫開發,比如ku…
-
找到惡意軟件包:Go 語言生態系統中的供應鏈攻擊是怎樣的?
近期發生的嚴重的 SolarWinds 攻擊事件和新型 “依賴混淆“攻擊,讓供應鏈攻擊成為討論焦點:攻陷供應鏈中不太安全的元素,導致更安全的目標遭攻陷。 供應鏈攻擊的流行目標一直都是流行編程語言的很多包管理系統,如 NPM (JavaScript)、Rubygems (Ruby) 以及 PyPI (Python)。這些系統常年來遭受惡意攻擊,攻擊者上傳惡意包并等待受害者安裝。 目前為止,尚未看到關于 Go 生態系統的供應鏈攻擊情況。鑒于 Go 語言是我的新寵,我決定自己做一些調查。 好在依賴混淆…
-
Go 中如何準確地判斷和識別各種網絡錯誤
Go語言集成了簡單易用的網路庫,今天的推送是一線架構師分享的Go網絡庫使用入門指南。 Go 自帶的網絡標準庫可能讓很多第一次使用它的人感慨,這個庫讓網絡編程的門檻低到了令人發指的地步。然而,封裝層次與開發人員的可控性往往是矛盾的。Go 的網絡庫封裝程度算是一個不錯的折衷,絕大部分時候,我們只需要調用 Dial, Read, Write Close 幾個基本操作就可以了。 但是,網絡是復雜的。我們有時候需要細致的處理網絡中的各種錯誤,根據不同的錯誤進行不同的處理。比如我們遇到一個網絡錯誤時,需要區…
-
使用 Go 實現 TLS socket server
安全傳輸層協議 TLS,以前稱為 SSL(Secure Sockets Layer) ,由于HTTPS的推出受到了很多人的歡迎。但是正如TLS的名稱 Transport Layer Security 所示的那樣,它實際上是獨立于 HTTP,一個更深入的安全協議,我們可以將 TLS 視為 TCP 的安全版本,其提供了對 socket 通信進行加密和簽名的功能。在我們的日常開發中,會將 gRPC 協議運行在TLS之上以確保安全。 今天我們來了解一下如何創建一個通過 TLS 加密的 socket 服務…