-
為什么越來越多的互聯(lián)網(wǎng)大廠開始使用Go語言?
近年來,你是不是發(fā)現(xiàn)越來越多的互聯(lián)網(wǎng)大廠開始使用Go語言了。其中包括騰訊、美團、滴滴、百度、Google、bilibili...還有最初使用Python的字節(jié)跳動,甚至已經(jīng)全面擁向Go了。 國內外首屈一指的公司們,為什么都開始使用Go語言了? 今天馬哥教育陪你談一談,它到底有什么優(yōu)勢? 說起Go的優(yōu)勢,多半是因為它有一些別人沒有的特性,或者優(yōu)化了別人麻煩的地方。 在了解Go的特點之前,我們先來看看其它幾種常見的語言。ps:這里不是說誰好誰壞,畢竟更多是因人而異。 C/…
-
Go語言高并發(fā)時append方法偶現(xiàn)錯誤的解決方法
在實現(xiàn)圖片轉碼的需求時,需要支持最大 500 個圖片下載后轉換格式; 如果是一個一個下載后轉碼,耗時太長,需要使用 goroutine 實現(xiàn) 500 個圖片并發(fā)下載后,并發(fā)轉碼; 但自測過程中發(fā)現(xiàn),會偶現(xiàn)下載后只轉換了 499 個圖片或更少的情況(全部下載、轉碼成功的條件下); 然后就開始了打印日志找 bug 的過程。 排查問題 因為并發(fā)時使用到了 sync 等待全部協(xié)程結束,起初以為是 sync 異步等待出了問題; 打印日志發(fā)現(xiàn),正常執(zhí)行了 500 次下載,執(zhí)行完成下載之后,繼續(xù)執(zhí)行的轉碼操作…
-
Go 語言開源項目使用的函數(shù)選項模式
01? 介紹 在閱讀 Go 語言開源項目的源碼時,我們可以發(fā)現(xiàn)有很多使用 “函數(shù)選項模式” ?的代碼,“函數(shù)選項模式” 是 Rob Pike 在 2014 年提出的一種模式,它使用 Go 語言的兩大特性,變長參數(shù)和閉包,可以使我們代碼更優(yōu)雅。 關于變長參數(shù)和閉包的介紹,需要的讀者朋友們可以查閱歷史文章,本文我們介紹 “函數(shù)選項模式” 的相關內容。 02? 使用方式 在介紹“函數(shù)選項模式”的使用方式之前,我們先閱讀以下這段代碼。 type?User?struct?{ ????Id?int ????…
-
使用 Asynq 實現(xiàn) Go 異步任務處理
1. 介紹 Asynq 是一個 Go 庫,用于對任務進行排隊并與工作人員異步處理它們。 它的工作原理: 客戶端將任務放入隊列 服務器從隊列中拉出任務并為每個任務啟動一個工作 goroutine 多個工作人員同時處理任務 倉庫鏈接:https://github.com/hibiken/asynq) #?2. 快速開始 ?2.1 準備工作 確保已安裝并運行了redis redis-server 安裝asynq軟件包 go?get?-u?github.com/hibiken/asynq 創(chuàng)建項目asy…
-
Go 語言源碼級調試器 Delve
01? 介紹 Delve 是一個簡單、強大和易用的 Go 語言源代碼層級的調試器,也是 Go 官方推薦使用的調試器。 02? 安裝 Delve 安裝非常簡單,如果讀者朋友使用的是 Go 1.16 或更高版本,可以直接使用?go install?安裝: go?install?github.com/go-delve/delve/cmd/dlv@latest 如果讀者朋友們使用的是低于 Go 1.16 的版本,可是先下載 Delve 源碼,然后使用?go install?安裝: git?clone?h…
-
深度解密Go語言之sync.map
工作中,經(jīng)常會碰到并發(fā)讀寫 map 而造成 panic 的情況,為什么在并發(fā)讀寫的時候,會 panic 呢?因為在并發(fā)讀寫的情況下,map 里的數(shù)據(jù)會被寫亂,之后就是?Garbage in, garbage out,還不如直接 panic 了。 本文目錄如下: 是什么 Go 語言原生 map 并不是線程安全的,對它進行并發(fā)讀寫操作的時候,需要加鎖。而?sync.map?則是一種并發(fā)安全的 map,在 Go 1.9 引入。 sync.map?是線程安全的,讀取,插入,刪除也都保持著常數(shù)級的時間復雜…
-
玩轉 Go 日志框架 zap
本文包括兩部分,一部分是源碼解讀,另一部分是對zap的增強。 由于zap是一個log庫,所以從兩方面來深入閱讀zap的源碼,一個是初始化logger的流程,一個是打一條log的流程。 Github地址:github.com/uber-go/zap… 初始化Logger zap的Logger是一般通過一個Config結構體初始化的,首先看下這個結構體有哪些字段 type?Config?struct?{ ???????//?日志Level,因為可以動態(tài)更改,所以是atomic類型的,畢竟比鎖的性能好…
-
淺談 Go 語言代碼注釋問題
每隔一段時間,網(wǎng)上總會突然出現(xiàn)一些令人討厭的帖子,其觀點是:不應該為代碼寫注釋,它存在的唯一原因是因為代碼本身不足夠好。對于這些論點,我完全不能茍同。 爛代碼 他們的觀點也不完全是錯誤的。沒有人能說自己的代碼足夠好。代碼本身也會慢慢變壞。你知道什么時候代碼腐爛得最厲害嗎?當你六個月沒有碰這些代碼的時候! 當回過頭再讀的時候,你會非常好奇:“這個作者到底是怎么想的?”(于是,使用 Git blame 來查看歷史記錄,沒想到代碼竟然是自己寫的,因為這是你的代碼。) 反對注釋者的論點是:需要注釋的唯一…
-
詳述 Golang 的符號表
???本文基于 Go 1.13。 符號表是由編譯器生成和維護的,保存了與程序相關的信息,如函數(shù)和全局變量。理解符號表能幫助我們更好地與之交互和利用它。 符號表 Go 編譯的所有二進制文件默認內嵌了符號表。我們來舉一個例子并研究它。下面是代碼: var?AppVersion?string func?main()?{ ?fmt.Println(`Version:?`+AppVersion) } 可以通過命令?nm?來展示符號表;下面是從?OSX?的結果中提取的部分信息: 00000000011772…
-
Go:符號表是什么?如何使用?
???本文基于 Go 1.13 ,原文及譯者信息在文末。 符號表是由編譯器生成和維護的,保存了與程序相關的信息,如函數(shù)和全局變量。理解符號表能幫助我們更好地與之交互和利用它。 符號表 Go 編譯的所有二進制文件默認內嵌了符號表。我們來舉一個例子并研究它。下面是代碼: var?AppVersion?string func?main()?{ ?fmt.Println(`Version:?`+AppVersion) } 可以通過命令?nm?來展示符號表;下面是從?OSX?的結果中提取的部分信息: 00…