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