hello,大家好呀,我是既寫 Java 又寫 Go 的小樓,在寫 Go 的過程中我經常對比這兩種語言的特性,踩了不少坑,也發現了不少有意思的地方,今天就來聊聊 Go 自帶的 HttpClient 的超時機制。Java HttpClient 超時底層原理在介紹 Go 的 HttpClient 超時機制之前,我們先看看 Java 是如何實現超時的。寫一個 Java 原生的 HttpClient,設置 ⌘ Read more
hello,大家好呀,我是既寫 Java 又寫 Go 的小樓,在寫 Go 的過程中我經常對比這兩種語言的特性,踩了不少坑,也發現了不少有意思的地方,今天就來聊聊 Go 自帶的 HttpClient 的超時機制。Java HttpClient 超時底層原理在介紹 Go 的 HttpClient 超時機制之前,我們先看看 Java 是如何實現超時的。寫一個 Java 原生的 HttpClient,設置 ⌘ Read more
Crawlab 是強大的網絡爬蟲管理平臺(WCMP),它能夠運行多種編程語言(包括 Python、Go、Node.js、Java、C#)或爬蟲框架(包括 Scrapy、Colly、Selenium、Puppeteer)開發的網絡爬蟲。它能夠用來運行、管理和監控網絡爬蟲,特別是對可溯性、可擴展性以及穩定性要求較高的生產環境。Crawlab 項目自 2019 年 3 月開始一直在不斷迭代,並且經歷了多 ⌘ Read more
大家好,我是每週在這裏陪你一起進步的網管。上篇文章我給大家分享了設計模式中的模版模式,給大家講了用模版模式在項目開發時提煉流程、減少重複開發的技巧。同時,在上一篇文章我也分享了我總結的一個暴論,那就是 “模板、策略和職責鏈三個設計模式是解決業務系統流程複雜多變這個痛點的利器”。今天我們繼續接着一起學習一下策略模式,以及用 Go 代碼怎麼實現策略模式。什麼是策略模式-------策略模式是一種行爲設 ⌘ Read more
介紹------有時,你的代碼需要當前程序的基礎上增加更多的功能。在這些情況下,你可以使用軟件包來豐富你的程序。在 Go 中, 一個包表示磁盤上單個目錄中的所有文件。包可以定義可以在其他 Go 文件或包中引用的函數、類型和接口。本教程將帶你來完成軟件包的安裝, 導入和重命名。標準庫包--------標準庫是 Go 附帶的一組軟件包。這些軟件包包含許多用於編寫現代軟件的基本模塊。例如, fmt 軟 ⌘ Read more
一、介紹 在 go 語言中,atomic 包提供和內存處理的原子化操作,在同步程序處理中,經常使用。 LoadUint32() 函數,提供加載原子化內存 addr,並返回 Uint32 格式。語法如下:// LoadUint32 atomically loads addr.func LoadUint32(addr uint32) (val uint32)在這裏 , addr 是地址,addr ⌘ Read more
一、介紹----yaml 作爲配置文件,基本在 go 中,被認爲默認的配置文件格式了。 yaml 格式介紹,詳見 https://www.ruanyifeng.com/blog/2016/07/yaml.html基本語法規則如下:大小寫敏感 使用空格縮進表示層級關係 縮進的空格數目不重要,只要相同層級的元素左側對齊就可以了。 我們看下面的 yaml 文件,新建 redis. ⌘ Read more
環境準備-------首先是 rpmbuild 的相關依賴,無論是什麼語言寫的程序,只要是打包成 rpm 包,就都需要這些yum install -y gcc make rpm-build redhat-rpm-configrpmbuild 的使用,需要你寫不少的配置,非常繁瑣,有研究過的人自然知道其中的淚。但大多數情況下,一個簡單的 rpm 包可能就只是執行一個二進制文件而已,完全沒有去花費大量 ⌘ Read more
一、認識指針與指針類型-----------一個指針變量可以指向任何一個值的內存地址,它所指向的值的內存地址在 32 和 64 位機器上分別佔用 4 或 8 個字節,佔用字節的大小與所指向的值的大小無關。當一個指針被定義後沒有分配到任何變量時,它的默認值爲 nil。每個變量在運行時都擁有一個地址,這個地址代表變量在內存中的位置。Go 語言中使用在變量名前面添加 & 操作符(前綴)來獲取變量的內存地 ⌘ Read more
2.10 沒有意識到類型嵌入可能存在的問題---------------------創建結構時,Go 提供了嵌入類型的選項。然而,如果我們不瞭解類型嵌入的所有影響,這有時可能會導致意想不到的行爲。在本節中,讓我們提醒我們如何嵌入類型,它帶來了什麼,以及可能的問題。在 Go 中,如果結構字段在沒有名稱的情況下聲明,則稱爲嵌入式結構字段。例如:type Foo struct { Bar} ⌘ Read more
爭做團隊核心程序員,關注「幽鬼」大家好,我是程序員幽鬼。Dolt DB[1] 是世界上第一個可以像 git 存儲庫一樣分支和合並、推送和拉取、分叉和克隆的 SQL 數據庫。我們從頭開始構建 Dolt 的存儲引擎,以加快這些操作。編寫行存儲引擎和 SQL 執行引擎並不容易。大多數人甚至不嘗試它是有原因的,但在 DoltHub,我們的構建方式不同。今天,我們將回顧幾個在對 Dolt 進行基準測試以使行 ⌘ Read more
自從 context 包在 Go 1.7 版本 [1] 加入 Go 標準庫,它就成爲了 Go 標準庫中較難理解和易誤用的包之一。在我的博客中目前尚未有一篇系統介紹 context 包的文章,很多來自 Go 專欄 [2] 或《Go 語言精進之路》[3] 的讀者都希望我能寫一篇介紹 context 包的文章,今天我就來嘗試一下 ^^。1. context 包入標準庫歷程2014 年,Go 團隊核心成員 ⌘ Read more
在編寫程序中,我們經常會遇到時間戳和日期字符串相互轉換、獲取當前時間、時間之間的比較操作。本文主要介紹 golang 中關於時間常用的操作。golang 中的時間操作在 time 包中。時間操作的基礎是基於一個 Time 的結構體。時間相關的操作都需要先轉換成 Time 結構體,再通過 Time 結構體相關的函數轉換成目標值。如下圖:圖片再來看 Time 結構體在源文件中的定義:type Time ⌘ Read more
一、atomic.Value 介紹-----------------atomic.Value 被設計用來存儲任意類型的數據,所以它內部的字段是一個 interface{} 類型。源碼在 src/sync/atomic/value.go 中type Value struct { v interface{}}除了 atomic.Value 外,atomic 包內部定義了一個 ifaceWords ⌘ Read more
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在閱讀 Go 語言開源項目的源碼時,我們可以發現有很多使用 “函數選項模式” 的代碼,“函數選項模式” 是 Rob Pike 在 2014 年提出的一種模式,它使用 Go 語言的兩大特性,變長 ⌘ Read more
【CSDN 編者按】放眼各大編程語言排行榜,幾乎很難看到國產編程語言身影,伴隨着我國基礎軟硬件的發力與追趕,尤其是在操作系統、數據庫等技術領域的累積,我們也漸漸看到一些國產編程語言的誕生,例如由一羣 Go 語言愛好者發起的凹語言,2018 年籌備再到今年 7 月正式開源,其背後有着怎樣的故事,開源 3 個月後,其又進行了哪些改進與提升呢?責編 \\| 夢依丹 出品 \\| 凹語言技術團隊官方投稿凹語言正 ⌘ Read more
昨天在內網上看到一篇講數據庫連接的文章,列出了一些 sql 包的一些源碼,我注意到其中取用、歸還連接的方式非常有意思——通過臨時創建的 channel 來傳遞連接。在 sql.DB 結構體裏,使用 freeConn 字段來表示當前所有的連接,也就是一個連接池。type DB struct { freeConn []driverConn}當需要拿連接的時候,從 freeConn 中取出 ⌘ Read more
https://github.com/alibaba/nacos 是阿里開源的服務發現和配置同步組件,上手非常容易,我們介紹下如何部署,然後看下 nacos 提供的 golang sdk:https://github.com/nacos-group/nacos-sdk-go 如何使用,分析下具體的源碼實現。docker run --name nacos-quick -e MODE= ⌘ Read more=
轉自: https://juejin.cn/post/7125012224623509540本文包括兩部分,一部分是源碼解讀,另一部分是對 zap 的增強。由於 zap 是一個 log 庫,所以從兩方面來深入閱讀 zap 的源碼,一個是初始化 logger 的流程,一個是打一條 log 的流程。Github 地址:github.com/uber-go/zap…[1]初始化 Logger- ⌘ Read more
大家好,我是網管,今天繼續來給大家更新設計模式系列的文章,之前已經把四種建造型的設計模式更新齊全啦,沒有看過的小夥伴可以通過點擊上面和文章尾部的系列合集鏈接,進行查看。從今天開始未來的三篇設計模式系列文章,我們學的設計模式在項目開發中應用率非常高,尤其是應對業務系統的重複開發率高、流程無兜底策略、產品需求無序擴展這幾個痛點上非常有用。那在這裏我先拋出一個我自己總結的暴論:“模板、策略和職責鏈三個設 ⌘ Read more
在工作中,主動性不僅體現在像老黃牛一樣把本職工作做好,還要主動和領導溝通,承擔更多、更重要的任務。\\-\\-\\- 吳軍 《格局》大家好,我是漁夫子。「Go 學堂」新推出 “Go 工具箱” 系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的是 web 應用安全防護方面的另一個包:securecookie。該包給 cookie 中存儲的敏感信息進行編、解碼及解密、解密功能,以 ⌘ Read more
大家好,我是煎魚。不知道有多少 Go 的面試題和泄露,都和 for 循環有關。今天我在週末認真一看,發現了 redefining for loop variable semantics[1] ,看來大家踩到的坑都是一樣的。著名的硬核大佬 Russ Cox 表示他一直在研究這個問題,表示十年的經驗表明了當前語義的代價是很大的,得動一動,看看能不能打破兼容性原則。想了下之前 Go modules 的事 ⌘ Read more
引子--在工作中,我時不時地會需要在 Go 中調用外部命令。前段時間我做了一個工具,在釘釘羣中添加了一個機器人,@這個機器人可以讓它執行一些寫好的腳本程序完成指定的任務。機器人倒是不難,照着釘釘開發者文檔添加好機器人,然後 @這個機器人就會向一個你指定的服務器發送一個 POST 請求,請求中會附帶文本消息。所以我要做的就是搭一個 Web 服務器,可以用 go 原生的 net/http 包,也可以用 ⌘ Read more
背景--有時候很多 API 有業務超時要求,就是數據必須在幾秒內返回,超時的話立刻結束,不用卡死在某一個頁面上。 目標--對這一類 API 特定處理,增加超時控制,不要影響別的 API 方案--方案很簡單,就是利用 go 提供的 context 技術對 gin 框架的 request 對象進行改造,使其具備超時控制機能。 代碼:package mainimport ( "cont ⌘ Read more
Go 自誕生以來就在其標準庫 [1] 內置了 log 包作爲 Go 源碼輸出日誌 [2] 的標準組件,該包被廣泛應用於 Go 標準庫自身以及 Go 社區項目中。不過,針對 Go 標準庫 log 包,Go 社區要求改進的聲音始終不斷,主流聲音聚焦在以下幾點:log 包是爲了方便人類可讀而設計的,不支持便於機器解析的結構化日誌 (比如像 zap 那樣輸出 json 格式的日誌 [3]); 不支持 ⌘ Read more
服務端開發一般是指業務的接口編寫,對大部分系統來說,接口中 CURD 的操作佔了絕大部分。然而,網絡上總有調侃 “CURD 工程師” 的梗,以說明此類開發技術並不複雜。但我個人認爲,如果僅僅爲了找個框架填充點代碼完成任務,確實是簡單,但是人類貴在是一根“會思考的蘆葦”,如果深入的思考下去,在開發過程中還是會碰到很多通用的問題的。我們就用 go 的開發框架舉例子,它有兩種分化形式:一種以 beego ⌘ Read more
之前寫過一篇文章,主要是介紹 wire 的多個依賴注入實現 go wire 入門實際使用中,很多人用的是框架,比如 kratos 是單體應用,這裏再着重介紹一下,這方面的使用。一、wire 介紹---------wire 依賴注入 有兩個核心概念 providers 和 injectors 。 語法如下:wire.Build(provide1, provide2,\\*\\*\\*)providers,主要 ⌘ Read more
一、介紹----wire 是提供 go 的依賴注入官方包地址爲 https://github.com/google/wire 我們打開官方 url,安裝方式如下go install github.com/google/wire/cmd/wire安裝後,就有 wire 命令可以用了,我試試在命令行工具裏,輸入 wire➜ wire輸出:wire: -: no Go files /Users/zhan ⌘ Read more
本文基於 Go 1.13 和 gops 0.3.7。 gops 旨在幫助開發人員診斷 Go 進程並與之交互。它提供了追蹤運行中的程序數秒鐘,通過 pprof 獲取 CPU 的 profile,甚至直接與垃圾回收器交互的能力。發現--gops 提供了一種發現服務,它可以列出計算機上運行的 Go 進程。不帶參數運行 gops 僅顯示 Go 進程。爲了舉例說明,我啓動了一個程序,該程序計算素數直到一百 ⌘ Read more
切片 (slice) 是 Go 語言中的一種重要的也是最常用的同構數據類型。在 Go 語言編碼過程中,我們多數情況下會使用 slice 替代數組,一來是因爲其動態可擴展,二來在多數場合傳遞 slice 的開銷要比傳遞數組要小(這裏有一些例外 [1])。切片算是 “半個” 零值可用的類型 [2],爲什麼這麼說呢?當我們聲明一個切片類型實例但在未顯式初始化的情況下,我們不能直接對其做下標操作,比如:v ⌘ Read more
上帝只垂青主動的人 \\-\\-\\- 吳軍 《格局》大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的是 web 應用安全防護方面的一個包:csrf。該包爲 Go web 應用中常見的跨站請求僞造(CSRF)攻擊提供預防功能。csrf 小檔案--------\\| 「csrf 小檔案」 \\|\\| --- \\|\\| star \\| 837 ⌘ Read more
大家好,我是煎魚。一個東西來來回回的討論,關了又開,關了後建新的,新的被 ban 了,又發現新的論據,再打開新的。這在職場工作中很常見,在 Go 的提案討論中,也出現了...今天要分享的是 Go map 在 NaN 上的一個爭議和可能即將出現的 API 增加。背景和考題-----NaN 是什麼在計算機科學中,有一個神奇的值, 叫做:NaN(Not a Number,非數)。它是數值數據類型的一類值 ⌘ Read more
你,我是小金!今天給大家推薦一個我最近正在學習的 Go 開源項目,一個使用 Go 語言實現的簡易版 Redis —— Godis。目前,Godis 這個項目在 Github 上收穫了 2.3k star。麻雀雖小,五臟俱全!目前這個項目已經支持下面這些功能:支持 string, list, hash, set, sorted set, bitmap 數據結構 自動過期功能 (TTL) ⌘ Read more
本文是 BRUNO CALZA 記錄的關於如何改變 SQLite 源代碼,使記錄行更新時可用於 Go 的更新鉤子函數的過程。原文通過深度定製 C 語言的 API 函數達成目的,這幾乎是所有 CGO 深度用戶必然經歷的過程(關於 CGO 的基本用法可以參考譯者的《Go 高級編程》第 2 章),是一個非常有借鑑意義的技術文章。作者:BRUNO CALZA 譯者:柴樹杉,凹語言 作者、Go 語言貢 ⌘ Read more
轉自: https://juejin.cn/post/7130001318046859272依賴注入----依賴注入可以降低代碼的耦合度。某功能依賴另一個實現,但是與該實現無任何責任。它只接收該實現並使用該實現,可以通過依賴注入方式進行解耦。比如以下例子,UserService 依賴很多模塊。Service 依賴很多模塊,我們可以將這部分內容都設置到 UserService 中,但這樣耦 ⌘ Read more
最近在 review 一些代碼中,發現經常某個類型定義的方法,其接收者既有值類型,又有指針類型,然後 Goland 就有提示: Struct Person has methods on both value and pointer receivers. Such usage is not recommended by the Go Documentation.一般來講,這個提示對代碼的運行並不會 ⌘ Read more
介紹------自從 Go 1.11 引入模塊後,Go 應用的依賴管理有了極大地提升。我們可以看到,使用 GOPROXY 能非常簡單地拉取一個模塊,更好地支持請求校驗和流水線式的依賴版本等等。但如果你想要創建自己的模塊,要怎麼開始開始呢?好消息是,相對而言,公開的包與私有的相比,並沒有太多的難度,反之亦然。但它們有一點 不同。 👉 注意:: 在本文中,Go 包和 Go 模塊的含義是相同的。不過, ⌘ Read more
一、介紹----官方文檔 https://pkg.go.dev/encoding/json 有介紹omitempty 如果字段的值爲空值(定義爲 false、0、nil 指針、nil 接口值以及任何空數組、切片、映射或字符串),該選項在編碼期間忽略該字段 "-" 標籤在編碼和解碼時總是省略字段 二、omitempty 空值省略----------------2.1 json 在結構體重 ⌘ Read more
對於程序員來說,編寫的代碼依賴標準庫是 “天經地義” 的事情。標準庫在程序員眼中就是高質量的代名詞,也是最值得信賴的非自己所寫的代碼,當然更是代碼包依賴關係鏈條上的最後一環,即所有直接或間接依賴的第三方 module 最終都會依賴標準庫。前兩天組內學習 rust[1] 的小夥伴說 rust 的標準庫還依賴第三方庫 (注:我對 rust 瞭解不深,尚未證實),這引發了我的一個疑問: Go 標準庫是否 ⌘ Read more
使用 Go 中的 SQL database 是容易的,只需下列這三步:// 步驟 1:導入主要的 SQL 包import "database/sql"// 步驟 2:導入一個驅動包來明確要使用的 SQL 數據庫import "github.com/mattn/go-sqlite3"// 步驟 3:用一個註冊好的驅動名稱來打開一個數據庫func main() { // ... db, err ⌘ Read more
最近學習 go 有一段時間了,在網上一直看到別人推薦,學 go 可以學習裏面的 context 源碼,短小精悍。看了下確實有所收穫,本文是基於我最近對 context 源碼學習的一些心得積累,望大家不吝賜教。 一、爲什麼使用 Context(一)go 的扛把子----------要論 go 最津津樂道的功能莫過於 go 強大而簡潔的併發能力。func main(){ go func(){ ⌘ Read more
你好,我是小四,你情商高也可以叫我四哥。碰到很多同學問我,平時疲於寫各種業務代碼,如何才能提高編程能力?我的辦法是多閱讀優秀的代碼,只有見過更好的,我們才能知道如何編寫好的代碼、提高編程能力。就好比如果學武功,你肯定要找一個武林高手作師傅。進入今天的正題。前一篇文章,我們分析了 go-cache 庫,今天再來看一個緩存庫 -- cache2go。網上也有很多文章分析了這個庫,閱讀過源碼的同學都是這 ⌘ Read more
轉自: https://juejin.cn/post/7128243201936687117開篇--上一篇文章初探 Golang 內聯 中我們瞭解了內聯的原理,規則。其實 Golang 標準庫裏,以 sync 包爲代表,其實針對鎖的實現,進行了專門的內聯優化。今天我們來實戰驗證一下。感興趣的同學建議先看下 Mutex 和 RWMutex 的源碼,旗幟鮮明地把 fast 和 slow 拆開 ⌘ Read more
一、const 語法介紹------------常量是一個簡單值的標識符,在程序運行時,不會被修改的量。 常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和複數)和字符串型。 常量的定義格式:const identifier [type] = value你可以省略類型說明符 [type],因爲編譯器可以根據變量的值來推斷其類型。顯式類型定義:const b string = "abc"隱 ⌘ Read more
轉自: https://juejin.cn/post/7117578224854368263摘要本文提出一種使用 Golang 進行 Excel 文件創建和讀取的方案。首先對問題進行分析,引出方案的基本架構;然後分章節描述了 Excelize 基礎庫的基本用法,以及 Excel 數據在 Golang 中的表示和解析方式,並進一步提出了應對大規模數據寫入場景的優化方法;最後,指出了一些可能 ⌘ Read more
在上一篇文章《通過實例理解 Go 內聯優化》[1] 中,我們探討了 Go 編譯器在編譯中端進行的內聯優化。內聯優化基於 IR 中間表示進行,不過 Go 編譯過程不止有一種 IR 表示,這點和龍書《編譯原理 (第二版)》[2] 的在第六章 “中間代碼生成” 一開始處的講解是一致的,即在將給定源語言的一個程序翻譯成特定的目標機器代碼的過程中,一個編譯器可能構造出一系列中間表示(IR),如下圖:高層中間 ⌘ Read more
大家好,我是 polarisxu。早在 Go1.18 快要發佈時,我就試用了工作區(workspace)模式,並寫了一篇介紹文章:Go1.18 快訊:Module 工作區模式。然而,Go1.18 正式發佈後,工作區模式有點變化,導致那篇文章的部分內容不試用了,於是今天重新補一篇,因爲工作區模式真的很有用。工作區模式(Workspace mode),可不是之前 GOPATH 時代的 Workspac ⌘ Read more
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在 Go 語言中,我們可以使用 errgroup 庫處理 goroutine 中的錯誤。errgroup 庫最近更新了,新增支持限制併發數量的功能。本文我們介紹 errgroup 庫的使用方式 ⌘ Read more
CasaOS 是一個基於 Golang 的簡單、易用、優雅的開源家庭雲系統。仔細想想我們的數據、智能設備和數字資產的控制權現在都在在一些大公司手中?你的相冊保存在他們的雲服務中嗎? 你的恆溫器、顯示器、燈具需要通過他們的雲服務來使用嗎? 你的個人文件、備忘錄、聯繫人、密碼等是否存放在他們的雲存儲服務中? 當他們決定改變價格、審查內容、甚至停止服務時,你必須接受嗎? 這聽起來 ⌘ Read more
移動互聯網時代,直面 C 端用戶的業務系統規模一般都很龐大,系統消耗的機器資源也很可觀,系統使用的 CPU 核數、內存都是在消耗公司的真金白銀。在服務水平不下降的前提下儘量降低單服務實例的資源消耗,即我們俗稱的 “少喫草多產奶”,一直是各個公司經營人員的目標,有些公司每降低 1% 的 CPU 核數使用,每年都能節省幾十萬的開銷。在編程語言選擇不變的情況下,要想持續降低服務資源消耗,一方面要靠開發人 ⌘ Read more
大家好,我是煎魚。如果說在 Go 裏要有一句與 interface{} 相關,你會想到什麼?是萬物皆要定義 interface,否則沒法抽象?Go 諺語中認可的是:"interface{} says nothing",也就是 interface{} 什麼也沒說。這指的又什麼,太黑話了吧...今天就煎魚和大家一起學習。接口類型無自描述--------interface{} 的第一種用法,那就是變量的 ⌘ Read more
健壯的代碼需要對用戶的不正確輸入、網絡連接錯誤和磁盤錯誤等意外情況做出正確的反應。錯誤處理是識別程序處於異常狀態並且採取措施去記錄供後期調試診斷信息的過程。相比於其他編程語言, 要求開發者使用專門的語法去處理錯誤, 在 Go 中將錯誤作爲 error(Go 中的一個接口類型) 類型的值, 並且和其他類型的值一樣作爲函數返回值的一部分返回。要處理 Go 中的錯誤, 我們必須檢查函數返回值中是否包含了 ⌘ Read more
之前做項目基本上公司是用 gRPC 和 echo 這兩個框架的組合,後來 Gin 框架在 Go 圈越來越流行,陸續我在公司接觸到的項目也開始有人用 Gin 框架開發了。因爲我也是偶爾開發,像 Gin 框架裏邊參數的模型驗證和綁定這些沒有系統去學習,都是粘貼一下其他人的代碼,改成我要的參數和模型,這裏說的模型就是保存請求數據的 Struct。慢慢我發現每個人寫的風格都不一樣,有直接一個個接收參數再賦 ⌘ Read more
Go 語言是一個極容易上手的語言,而且 Go 程序的優化套路基本上被大家莫得清清楚楚的,如果你有心,可以在互聯網上搜出很多 Go 程序優化的技巧,有些文章可能只介紹了幾個優化點,有些文章從 CPU 的架構到 Slice 預分配,再到通過 pprof 找性能的瓶頸點等等全面介紹 Go 程序的優化,所以說可見的手段基本上被大家摸得門清,最近老貘出了一道題,如下所示,可以看到大家對 Go 語言的優化已經 ⌘ Read more
在公司的不斷髮展中,一開始大多是大單體,改造慢了,一個倉庫會有使用十幾年的情況,倉庫的規模基本是不斷增大的過程。影響之一就是會應用程序打包後的體積越來越大,不知道被用哪裏去了... 今天要探討的提案《proposal: language: lazy init imports to possibly import without side effects[1]》,就與此有關。提案--背景我們來觀察一 ⌘ Read more
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在 Go 語言標準庫 time 包中的 Timer 類型,它是表示單一事件的計時器,也就是說它是一次性定時器。在 Go 語言項目開發中,定時器使用廣泛,本文我們介紹 Go 語言中怎麼使用 Tim ⌘ Read more
文檔(代碼註釋)是編碼的一個重要方面,它可以降低客戶端使用 API 的複雜度,也有助於項目維護。在 Go 語言中,我們應該遵循一些規則使得我們的代碼更地道。下面一起來看看這些規則。每個可導出的元素必須添加文檔說明,無論是結構體、接口、函數還是其他元素。如果它被導出,則必須有文檔說明。通用的文檔說明是添加註釋,註釋前以元素名稱開始,像下面這樣。// Customer is a customer re ⌘ Read more
GORM 的那些困擾----------GORM 進入到 2.0 時代之後解決了很多 jinzhu/gorm 時代的問題,整體的擴展性以及功能也更強大。但總有一些繞不開的問題困擾着我們。SQL 注入Object Relational Mapping 的定位就是幫助開發者減輕心智負擔,你不用再去思考業務 object 和 數據表 relation 之間的對應,ORM 框架來幫你完成。我們只需要簡單的 ⌘ Read more
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。土撥鼠最近換了 M1 的電腦,由於 MAC 的隔空發送一直髮現不了對方,就想起 17 年用過的一個用 Go 寫的傳輸工具,一直有點印象,忘記叫什麼名了,在 GitHub 上 star 列表終於才搜到 croc[1]。這下趕緊順手給他歸了一下 repo 的類別。下來土撥鼠簡單介紹一下這個庫。croc有鱷 ⌘ Read more
在 profiling 方面,Go 是獨一無二的。在 runtime 裏面它包含強大的,有自主意識的 profilers。其他編程語言像 Ruby,Python,或者 Node.js,包含了 profilers 或者一些 APIs 接口用來寫 profiler。但與 Go 提供的開箱即用的服務相比,它們的範圍還是有限的。如果你想學習更多關於 Go 提供的可觀測性工具,我強烈建議 Felix Gei ⌘ Read more
文章來自於 http://blog.helongfei.com/2019/%E7%9B%91%E6%8E%A7-go-runtime/,也可以閱讀原文閱讀。Go 通常作爲守護進程存在,若我們不做任何監控,放任其「自由」的使用資源,那有可能會發現意外情況,比如「Goroutine 泄露」。那我們應該如何監控,又要監控哪些指標呢?監控指標監控的核心是監控指標,「有用」的指標纔是有意義,那 Go 有 ⌘ Read more
前言--小土之前分享過一篇如何監控 Go Runtime 的文章,主要是通過 Grafana,Graphite,Statsd 等組件來採用 UDP 協議採集 metrics 上報到 Grafana 來進行一系列的展示。相對比較繁瑣。今天小土帶來一個 Go 庫 statsviz-https://github.com/arl/statsviz 可以一鍵集成到你的 HTTP 服務中,並且在瀏覽器中可以實 ⌘ Read more
大家好,我是程序員幽鬼。分享一篇關於 map 和 “內存泄露” 的文章。摘要:map 總是可以在內存中增長;它從不收縮。因此,如果它導致一些內存問題,你可以嘗試不同的選項,例如強制 Go 重新創建 map 或使用指針。在 Go 中使用 map 時,我們需要了解 map 如何增長和收縮的一些重要特徵。讓我們深入研究一下,以防止可能導致內存泄漏的問題。首先,要查看此問題的具體示例,讓我們設計一個場景, ⌘ Read more
介紹--在 Go 中,數組和切片是數據結構,由元素的有序序列組成。當你想處理許多相關的值時,這些數據集合是很好的選擇。它們可以讓你把相同類型的數據放在一起,降低代碼量,並同時對多個值執行相同的方法和操作。雖然 Go 中的數組和切片都是元素的有序序列,但兩者之間有很大的區別。Go 中的數組是一個數據結構,由一個有序的元素序列組成,其容量在創建時已經定義。一旦數組分配了它的大小,就不能再改變它的大小。 ⌘ Read more
使用 CFSSL 生成自己的 CA 正式在修改服務端代碼之前,我們先創建幾個證書。我們可以通過第三方認證機構獲取證書,但那需要花錢而且麻煩。對於內部服務的話,沒必要通過第三方機構。受信任的證書不一定來自於 Comodo 或 Let 's Encrypt 或任何其他權威 CA 機構,它們可以來自於自己生成的 CA。只要有合適的工具,這是免費也容易做到的。CloudFlare 公司 (一家美國雲計算公 ⌘ Read more
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的是一個強大、實用、簡單的圖像處理工具:imaging。以下是該工具的基本檔案:table width="505" interlaced="enabled"tbodytr data-darkmode-bgcolor-16653742333917="rgb(28, 28, 28 ⌘ Read more=
今天聊一個存儲的實現細節,數據副本的併發寫入。存儲的高可靠性和高可用,必須依賴於數據的冗餘機制。比如 3 副本就是把用戶數據複製成 3 份。然後把 3 份數據分發到不同的地方。這個寫下去的動作是有講究的,因爲肯定不希望時延線性增加,你肯定希望的是雖然多寫 2 份數據,但還只耗費 1 份時間。換句話說,原則上數據雖然變多了,但是時間開銷不能增加。那就只能併發寫入嘍!那這個動作怎麼實現呢?帶大家思考幾 ⌘ Read more
創建 util 包不是一種好的做法本文將討論 Go 語言中一種常見的不好的實踐:創建 utils、common 和 base 等共享包。首先分析這種做法存在的問題,然後討論如何改進。下面是一個受 Go 官方博客啓發構造的例子,實現一個集合數據結構。在 Go 語言中完成該功能的慣用方法是通過 map[K]struct{} 類型來處理,K 是 map 中允許的任何類型作爲鍵,而值是 struct{} ⌘ Read more
本文基於 Go 1.13 ,原文及譯者信息在文末。符號表是由編譯器生成和維護的,保存了與程序相關的信息,如函數和全局變量。理解符號表能幫助我們更好地與之交互和利用它。符號表---Go 編譯的所有二進制文件默認內嵌了符號表。我們來舉一個例子並研究它。下面是代碼:var AppVersion stringfunc main() { fmt.Println(Version: +AppVersion)}可 ⌘ Read more
轉自: https://juejin.cn/post/7137669791879266335Golang 標準庫中的 flag 庫提供瞭解析命令行選項的能力,我們可以基於此來開發命令行工具。假設我們想做一個命令行工具,我們通過參數提供【城市】,它自動能夠返回當前這個【城市】的天氣狀況。這樣一個簡單的需求,今天我們就來試一下,看怎樣實現。flag 庫------ Package flag ⌘ Read more
項目結構混亂創建一個好的 Go 項目結構並不是一件容易的事情,由於 Go 語言在設計包和模塊方面提供了很大的自由度,因此在這方面沒有通用的最佳實踐。本文將首先討論創建項目的常用組織結構,然後討論一些最佳實踐,給出改進項目組織方式的方法。項目結構Go 語言維護者對構建 Go 項目結構沒有嚴格的約定,在 github 上有一個稱爲標準 Go 項目結構的模板(https://github.com/gol ⌘ Read more
大家好,我是程序員幽鬼。在這篇文章中,我想談談一個基於流行的開源項目 hystrix 的 circuit breaker (斷路器)模式(實際上,我會看看 golang 版本的 hystrix-go[1],而不是用 Java 編寫的原始版本 [2])。在本文的第一部分中,我將對 circuit breaker 進行一般性介紹,讓你瞭解它是什麼以及它爲什麼重要。此外,讓我們回顧一下 hystrix- ⌘ Read more
轉自: https://juejin.cn/post/7131378441428926501各位運維同仁肯定都多多少少面臨過,爲了節省不必要的開支,很多不那麼重要的域名https證書大多數都是申請的免費的單域名證書,這造成檢測非常不方便,雖然運營商ssl證書到期前會預警,但是爲了避免該類問題,我們可以編寫一個web用於檢測ssl證書檢測工具。搭建 demo我們還是使用我們編寫的Sampl ⌘ Read more
Go 是那種自帶 profiler (分析器) 的語言之一。它的運行時包含強大的自成一派的各種 profiler。其它語言,比如 Ruby、Python 和 Node.js, 它們也包含 profiler 或者一些用來編寫 profiler 的 API,但是與 Go 的開箱即用的 profiler 相比,它們提供的 profiler 功能有限。如果你想多瞭解 Go 提供的這些可觀察工具的情況,我強 ⌘ Read more
你是否遇到過 assignment copies lock 的錯誤?當我們用 go vet 檢查靜態問題的時候,你是否遇到 noCopy 相關的錯誤。最典型的就是 lock 的變量,測試代碼:func main() { var mu sync.Mutex var i int // mu 重新拷貝出來一個 m := mu m.Lock() i += 1 m ⌘ Read more=
https://juejin.cn/post/7135803728916905997開篇--今天繼續我們的 Golang 經典開源庫學習之旅,這篇文章的主角是 validator,Golang 中經典的校驗庫,它可以讓開發者可以很便捷地通過 tag 來控制對結構體字段的校驗,使用面非常廣泛。validator--------- Package validator implements val ⌘ Read more
今天給大家分享的是 Go 諺語中的 Cgo is not Go[1],原文章同名,略有修改,原文作者是 @Dave Cheney。以下的 “我” 均指代原作者。借用 JWZ 的一句話:有些人在面對一個問題時,認爲 "我知道,我會使用 cgo(來解決這個問題)"。在使用 cgo 後,他們就會遇到兩個新問題。Cgo 是什麼-------Cgo 是一項了不起的技術,它允許 Go 程序與 C 語言庫相互操 ⌘ Read more
大家好,我是煎魚。在國外的播客節目 Go Time #100 中,Rob Pike 和 Robert Griesemer(Go 的兩位創始人)和主持人 Jerod Santo 討論了 Go 語言的成功緣由和一些思考。如果你想創造一門成功的編程語言,向已經做到的人學習是非常有價值的。歡迎對 Go 感興趣的小夥伴一起圍觀!說明-----Rob Pike(下稱:Rob)將 Go 的成功歸爲了 5 個方面 ⌘ Read more
前段時間,使用 Golang 寫了個解壓 tar 文件的小工具,速度比 linux 自帶的 tar 要快很多(4、5 倍差距),而且同樣支持稀疏文件,具體關於稀疏文件的解釋,可以參考我這篇文章 Golang 和稀疏文件。前方高能,稍微有點枯燥,但能學到東西:tar 標準包不支持稀疏文件,自己如何支持 如何調用私有方法 如何提升解壓性能 golang tar 解壓--------- ⌘ Read more
大家好,我是程序員幽鬼。VSCode 目前是最流行的編輯器,沒有之一。它的插件也很多,本文介紹 Go 開發人員的插件列表。當我還是個孩子的時候,我決定只使用開源工具。當時,這是一個艱難的決定,因爲許多開源工具都沒有良好的性能。圖片來自:https://triplebyte.com/blog/editor-report-the-rise-of-visual-studio-code正如斯托曼所說,“珍 ⌘ Read more
gRPC 具有很好的錯誤處理機制。在前面的代碼中,我們返回的錯誤和 Go 標準庫中的代碼一樣。儘管這段代碼可以處理不同計算機之間調用,但由於 gRPC 抽象了網絡細節,讓你對底層細節所知不多。默認情況下,您的錯誤只有一個字符串描述,但是你可能希望錯誤能包括更多的信息,如狀態碼或一些其他任意數據。Go 的 gRPC 實現中有一個非常實用的 status 包,你可以用來創建帶狀態碼的錯誤或者添加任何其 ⌘ Read more
大家好,我是 frank。 歡迎大家點擊標題下方藍色文字「Golang 語言開發棧」關注公衆號。 設爲星標,第一時間接收推送文章。 文末掃碼,加羣一起學 Golang 語言。01 介紹在 Go 語言中,切片類型比較常用,將新元素追加到切片也比較常見,因此 Go 語言提供一個內置函數 append,該函數可以非常方便實現此功能。雖然 Go 語言內置函數 append 使用非常方 ⌘ Read more
引言--筆試題遇到 var x string = nil ,問這個定義是否正確?這裏給出答案:cannot use nil as string value in variable declaration。也就是說,string類型和nil八竿子打不着,要想判斷字符串是否爲空,可以使用str ""或者len(str) 0。接下來,順便總結一下 nil 的使用nilnil 是 go 語言中 ⌘ Read more=
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。今天給大家推薦的是一個版本比較工具。該工具基於語義化標準的版本號進行比較、約束以及校驗。以下是 go-version 的基本情況:table interlaced="enabled"tbodytr data-darkmode-bgco ⌘ Read more=
近期閱讀了 John Arundel[1] 的文章《The Tao of Go》[2],看完後我都有心去閱讀一遍《道德經》了:)。作者將 Go 語言設計哲學與慣例 [3] 與 “道” 學三寶有機的聯繫到一起,給了我不小的啓發。這裏譯成中文,供大家參考。 你可以讓水牛去任何地方,只要它們想去 - 傑拉爾德・溫伯格 《諮詢的奧祕》4“道” 是指事物的內在本質或自然趨勢。例如,水向低處流:這就是水的 ⌘ Read more*
布爾數據類型(bool)可以是兩個值中的一個,即真或假。布爾型數據在編程中被用來進行比較和控制程序的流程。 Boolean 在 Go 中的數據類型是bool,全部小寫。值 true 和 false 總是分別用小寫的 t 和 f,因爲它們是 Go 中的特殊值。本教程將涵蓋你需要了解 bool 數據類型如何工作的基礎知識,包括布爾比較、邏輯運算符和真值表。比較運算符-----在編程中,比較運算符被用 ⌘ Read more
1\\. 前言---------開發時,經常會碰到要把 map 轉成 struct,或者把 struct 轉成 map,方便數據處理。這個時候我們可以用到 mergo 。它非常簡單、好用,輔助我們更高效的開發。2. 特性---------mergo 有很多特性:支持 struct 轉成 map map 轉成 struct 支持各種選項,比如覆蓋寫等 … …. 更多功能特性請查看 ⌘ Read more
Go 字符串實現原理Go 的字符串有個特性,不管長度是多少,大小都是固定的 16 字節。package mainimport ( "fmt" "unsafe")func main() { fmt.Println( unsafe.Sizeof("komeiji satori"), ) // 16 fmt.Println( unsafe.Si ⌘ Read more
前言--如果一個類的有非常多的屬性,層級還很深。每次構造起來,不管是直接構造還是用建造者模式,都要對太多屬性進行復制,那麼有沒有一種好的方式讓我們創建太的時候使用體驗更好一點呢? 今天的文章裏就給大家介紹一種設計模式,來解決這個問題。這篇內容要說的是創造型設計模式裏的原型模式,如果寫過點 JS 代碼的話,大家可能聽說過原型鏈這麼個東西,原型模式在 JavaScript 實現裏確實廣泛應用,它那個面 ⌘ Read more
作爲小廠,我們的基礎設施還不夠完備,項目經理中秋節通知我們的系統近期要上 second-to-last stage 環境和生產環境,於是從運維人員部署效率方面考量,我們緊急開發了一個一鍵安裝腳本生成工具,這樣運維人員便可以利用該工具結合實際目標環境生成一鍵安裝腳本。這個工具的原理十分簡單,如下示意圖所示:從上圖可以知道,我們的工具是基於模板定製最終的配置與安裝腳本的,其中:templates/co ⌘ Read more
Photo by Ian Taylor on Unsplash.你是否想寫一個使用 Docker 容器化的 Golang 應用程序?本文的目的就是幫助你快速將你的 Golang 應用程序容器化,以用於開發(帶熱加載)和生產目的。開始之前----請先安裝 Docker Desktop ,然後再繼續。安裝後,啓動桌面應用程序,如果它運行成功,你就可以開始了。此外,我假設你有一個 $GOPATH 目錄 ⌘ Read more
從 cron 說起---------在 Unix-like 操作系統中,有一個大家都很熟悉的 cli 工具,它能夠來處理定時任務,週期性任務,這就是: cron。 你只需要簡單的語法控制就能實現任意【定時】的語義。用法上可以參考一下這個 Crontab Guru Editor[1],做的非常精巧。簡單說,每一個位都代表了一個時間維度, 代表全集,所以,上面的語義是:在每天早上的 4 點 05 分觸 ⌘ Read more
大家好,我是 frank。 歡迎大家關注「Golang 語言開發棧」公衆號。 01 介紹 在 Go 語言中,通過聲明或者通過調用 new 爲變量分配存儲空間,或者通過複合字面量或調用 make 創建新值時。如果未提供顯式初始化,則會爲變量或值指定默認值,此類變量或值的每個元素都設置爲其類型的零值。02 Golang 類型的零值 在 Go 語言中,原生類型都有默認值,即類型的零值。布爾型 ⌘ Read more
介紹------數字在編程中很常見。它們被用來表示一些東西,如:屏幕大小的尺寸、地理位置、金錢和積分、視頻中經過的時間、遊戲頭像的位置、通過分配數字代碼表示的顏色等等。在編程中進行數學運算是一項重要的技能,因爲你會經常與數字打交道。儘管對數學的理解肯定能幫助你成爲一個更好的程序員,但它不是一個先決條件。如果你沒有數學背景,試着把數學看作是完成你想實現的目標的工具,並作爲提高你的邏輯思維能力的一種 ⌘ Read more
大家好,我是漁夫子。本號新推出「Go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。同時瞭解其底層的實現原理,以便更深入地瞭解 Go 語言。 今天給大家推薦的是一個可以將變量以一種非常友好的方式輸出其完整的數據結構信息的工具:go-spew。 該包經過了全面的測試,測試覆蓋率爲 100%。支持各種自定義配置,非常方便,可以有效提升我們日常開發的效率。下面是該包的基礎檔 ⌘ Read more
github.com/looplab/fsm 實現了一個有限狀態機,下面研究下它的源碼,除了測試文件外,它有下面幾個文件:errors.go //定義了錯誤fsm.go //定義了狀態機的核心邏輯event.go //定義了事件結構體graphvizvisualizer.go //生成graphviz格式的文件mermaidvisualizer.go // 生成mer ⌘ Read more
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。今天給大家推薦的工具是 deepcopy,一個可以對指針、接口、切片、結構體、Map 都能進行深拷貝的工具。在 Go 中需要對一個變量進行拷貝時分淺拷貝和深拷貝。淺拷貝就是拷貝後就是無論改變新值還是原值都對對另一個產生影響,比如切片。而深拷貝則是將目標值完全拷貝一份,消除這種影響。實現原理 ⌘ Read more
背景--基於現在微服務或者服務化的思想,我們大部分的業務邏輯處理函數都是長這樣的:比如 grpc 服務端:func (s Service) GetUserInfo(ctx context.Context, req pb.GetUserInfoReq) (pb.GetUserInfoRsp, error) { // 業務邏輯 // ...}grpc 客戶端:func (s Service ⌘ Read more
大家好,我是漁夫子。本號新推出「go 工具箱」系列,意在給大家分享使用 go 語言編寫的、實用的、好玩的工具。 今天給大家推薦的工具是 hashids。該工具可以將一個正整數轉換成長度較短、唯一且不連續的 ID 值。一般適用於生成用戶 ID,但又不想用有規律的 ID 的場景。 原理分析:將長字符串轉換成短字符串的本質是進制轉換。將小進制數往大進制數上轉換就會變短,將大進制數往小進制數上轉換就會 ⌘ Read more
協程--goroutine 是輕量級線程,調度由 Go 運行時進行管理的。Go 語言的併發控制主要使用關鍵字 go 開啓協程 goroutine。Go 協程(Goroutine)之間通過信道(channel)進行通信,簡單的說就是多個協程之間通信的管道。信道可以防止多個協程訪問共享內存時發生資源爭搶的問題。語法格式:// 普通函數創建 goroutinego 函數名(參數列表)//匿名函數創建 g ⌘ Read more
美國計算機學會通訊 (Communications of the ACM)[1] 期刊 2022 年 5 月第 65 卷第 5 期將發表一篇有關 Go 語言的綜述類 Paper:《Go 編程語言與環境》[2],這類綜述類文章只有資深的 Go 核心團隊的人才 “有資格” 寫,該文的作者列表印證了這一點,他們是 Russ Cox,Robert Griesemer,Rob Pike,Ian Lance ⌘ Read more