大家好,我是漁夫子,又跟大家見面了。今天跟大家聊聊 Go1.18 中新增的泛型功能。。01 Go 中的泛型是什麼衆所周知,Go 是一門靜態類型的語言。靜態類型也就意味着在使用 Go 語言編程時,所有的變量、函數參數都需要指定具體的類型,同時在編譯階段編譯器也會對指定的數據類型進行校驗。這也意味着一個函數的輸入參數和返回參數都必須要和具體的類型強相關,不能被不同類型的數據結構所複用。而泛型就是要解決 ⌘ Read more
大家好,我是漁夫子,又跟大家見面了。今天跟大家聊聊 Go1.18 中新增的泛型功能。。01 Go 中的泛型是什麼衆所周知,Go 是一門靜態類型的語言。靜態類型也就意味着在使用 Go 語言編程時,所有的變量、函數參數都需要指定具體的類型,同時在編譯階段編譯器也會對指定的數據類型進行校驗。這也意味着一個函數的輸入參數和返回參數都必須要和具體的類型強相關,不能被不同類型的數據結構所複用。而泛型就是要解決 ⌘ Read more
大家好,我是程序員幽鬼。gRPC 越來越流行,相關的插件也很多,今天介紹的就是一個 gRPC 插件。 gRPC-Gateway 是一個插件,它爲 gRPC 服務生成反向代理服務器,將 Restful/JSON 轉換爲 gRPC,反之亦然。換句話說,gRPC-Gateway 將在你的 gRPC 服務上創建一個層,該層將充當客戶端的 Restful/JSON 服務。gRPC-Gateway 從 gRP ⌘ Read more
對於一個項目來說,不可能所有代碼都自己寫。 所以這就涉及到引入別人的代碼,得有效避免重複造輪子,在 Go 語言裏面,這個操作也叫引包。Go 語言誕生之後,升級了很多次一直都沒有官方的包管理工具。一直到 1.11 版纔出現 go module 這個官方的管理工具。於是現在的大部分 Go 語言新項目都在使用 go module 來進行包管理。我們用得非常多的是使用 go module 引入 Gith ⌘ Read more
【導讀】本文介紹了 ServeMux 路由的內部實現。功能簡介根據 Golang 文檔 (https://golang.org/pkg/net/http/#ServeMux) 中的介紹,ServeMux 是一個 HTTP 請求多路複用器 (HTTP Request multiplexer)。具體來說,它主要有以下兩個功能:路由功能,將請求的 URL 與一組已經註冊的路由模式 (pattern) 進 ⌘ Read more
背景有的時候我們會遇到併發 IO 的情況,例如,併發爬蟲下載網絡上的圖片。如果併發度過高或者下載的內容過大,會導致網絡 IO 耗時急劇上升。這時候就需要優化一下每次網絡 IO 的耗時。網絡下載圖片用例以下載網絡數據爲例,下面是典型的代碼。func TestHttpGet(t testing.T) { rsp, err := http.Get("http://xxx.com") if e ⌘ Read more=
得益於 Go 語言優秀的運行時調度系統,即使開發人員沒有多線程編程經驗,也能很容易地開發併發程序。調度系統,其中最核心的就是 GMP 的設計,欲深入理解 Go 語言設計的讀者都應該看過這些知識。但是,在通過相關博客或者源碼學習時,如果不能和實際的代碼進行結合,在理解上或許不夠深刻。本文介紹一種方式,即使用 GODEBUG 工具,通過實際運行代碼來直觀地查看 Go 運行時的調度過程。調度簡述---- ⌘ Read more
前言 -----最近遇到一個臨時需求,需要將客戶環境中一個服務每天的日誌進行一系列複雜處理,並生成數據報表。由於數據處理邏輯複雜,且需要存入數據庫,在客戶環境使用 shell 腳本無法處理,因此就需要將日誌先拷貝到本地,再進行處理;同時爲了避免每天人工拷貝日誌,需要實現自動化,整條鏈路自動執行,無需人工干預。平時使用 Go 語言較多,由此就引出了 Go 語言 ssh 連接遠程客戶服務器,並利用 ⌘ Read more
當一個項目越來越複雜的時候,一定會拆分爲多個模塊,以便進行代碼複用和更好的多人協作開發。 假設我們已經有了兩個模塊 flysnow.org/util 和 flysnow.org/product ,模塊 flysnow.org/product 依賴 flysnow.org/util 。現在有一個需求,需要同時修改這兩個模塊,以便讓 flysnow.org/util 新增的方法給模塊 flysnow ⌘ Read more
作者:fitchguo,騰訊 IEG 後臺開發工程師併發編程,可以說一直都是開發者們關注最多的主題之一。而 Golang 作爲一個出道就自帶 “高併發” 光環的編程語言,其併發編程的實現原理肯定是值得我們深入探究的。Go 併發編程模型在底層是由操作系統所提供的線程庫支撐的,這裏先簡要介紹一下線程實現模型的相關概念。線程的實現模型線程的實現模型主要有 3 個,分別是:用戶級線程模型、內核級線程模型和 ⌘ Read more
大家好,我是 polarisxu。本文是網友「charlesxsh」投稿。 賓州州立大學系統安全實驗室 [1] 依靠模糊測試的思想設計了檢測工具 GFuzz,能自動檢測 Go 程序中的併發缺陷。GFuzz 在著名的開源軟件(如 Docker,Kubernetes)中發現了 184 個此前未知的併發缺陷。 工具:https://github.com/system-pclub/GFuzz[2]英文論文 ⌘ Read more
哈嘍,大家好,我是 Go 大叔,專注分享 Go 語言知識,一起進入 Go 的大門。 大叔和身邊一羣大牛都無限看好 Go 語言,現在開始搞 Go 語言,過兩年大概就是第一批喫螃蟹的人。歡迎大家來到『Go 語言入門到精通』這個專欄,今天是專欄第 22 篇,大叔主要和大家分享一下 Go語言和C語言交叉訪問相關的知識點。Go 語言中調用 C 語言函數---------------在 Go 語言開篇中我們 ⌘ Read more
這一篇是之前給極客時間 tony bai 老師專欄的供稿,經過編輯的同意,延遲幾個月後可以在我的個人號上發出~本文內容只作瞭解,不建議作爲面試題考察。武林祕籍救不了段錯誤----------包教包會包分配在各種流傳甚廣的 C 語言葵花寶典裏,一般都有這麼一條神祕的規則,不能返回局部變量:int func(void) { int num = 1234; / ... / retur ⌘ Read more
試用一下 Go 1.18 泛型和 Fuzz 測試的功能,按照官方文檔 [1,3] 跑一些小 case。Go1.18 安裝安裝最新版本的 Go,下載地址 https://go.dev/dl/$ go versiongo version go1.18 darwin/amd64泛型例子Go 模塊初始化$ mkdir generics && cd generics$ go mod init example ⌘ Read more
大家好,我是煎魚。協程(Goroutine)是 Go 語言的一個大殺器,而我們常常需要在多個協程之間進行各種協調和通訊。圖來自 @Soham Kamani所有 Go 有一個特別獨特的東西,他就是上下文(context),你會在各種函數的第一個入參處見到他,標配了。場景包含但不限於:依賴 context 傳遞公共的上下文信息。 使用 goroutine 時進行異步操作,依賴 context 進 ⌘ Read more
1 需求在前後端分離項目中分頁是非常常見的需求,最近在使用 Gin 重構 SpringBoot 項目,整合的 orm 框架是 Gorm。然而 Golang 生態相對來 Java 說比較靈活(低情商:簡陋),很多東西都需要自己封裝 。網上查了一圈 Gorm 的分頁方案感覺都不是自己需要的,因此打算使用 Gorm 封裝一個類似 Mybatis-Plus 的分頁方案,可以對實現類似 “泛型” 查詢的效果 ⌘ Read more
我們在開發 Go 項目時,經常會使用到一些外部依賴包。它們一般都是通過形如go get example.com/xxx的命令形式獲取到本地使用。本着開源精神,如果我們想將自己開發的包共享出去,讓其他人也能使用go get命令獲取到它們,應該如何做呢?本文將以開源至 Github 平臺爲例,展示其流程。建立倉庫----首先,在 github 平臺建立倉庫,設置想要開源的 Go 庫名。這裏將項目名取爲 ⌘ Read more
特別說明:這個真的不是標題黨,我寫代碼 20 + 年,真心認爲 go fuzzing 是我見過的最牛逼的代碼自測方法。我在用 AC自動機 算法改進關鍵字過濾效率(提升~ 50%),改進 mapreduce 對 panic 的處理機制的時候,都通過 go fuzzing 發現了極端邊緣情況的 bug。所以深深的認爲,這是我見過最牛逼的代碼自測方法,沒有之一! go fuzzing 至今已經 ⌘ Read more
本文將簡單介紹一下 go 語言的彙編。 主要的內容如下: plan 9 是什麼?爲什麼學習 plan9? plan9 的常見指令 go 程序如何轉換爲 plan9 ? 下面就開始簡單介紹一下。 plan 9 是什麼?爲什麼學習 plan9?plan9, Go 一套自己的彙編。按照官方文檔的說法,其設計初衷是解決跨平臺的問題,但是沒有做好。並且它不同於傳統的彙編,也就是說要想 ⌘ Read more
Go 的內存泄漏內存泄漏通常在 c/c++ 等語言常見,手工管理內存對程序猿的編程能力有較高要求。最常見的就是分配和釋放沒有配對使用。 Go 是一門帶 Gc 的語言,內存分配位置由編譯器推斷是在棧還是堆上,內存分配完全由 Go 本身把控,程序猿無法介入。程序猿在前端觸發分配,後端的 runtime 的 GC 任務則不斷的回收內存,從而達到一個平衡。理論上是不存在常規意義的內存泄漏的。但在程序中, ⌘ Read more
要搞明白 Go 語言中的指針需要先知道 3 個概念:指針地址、指針類型和指針取值。go-func-pointer Go 語言中的指針---------Go 語言中的函數傳參都是值拷貝,當我們想要修改某個變量的時候,我們可以創建一個指向該變量地址的指針變量。傳遞數據使用指針,而無須拷貝數據。類型指針不能進行偏移和運算。Go 語言中的指針操作非常簡單,只需要記住兩個符號:&(取地址)和\\
\\
(根據 ⌘ Read more
XA 是什麼------XA 是由 X/Open 組織提出的分佈式事務的規範,XA 規範主要定義了 (全局) 事務管理器 (TM) 和(局部)資源管理器 (RM) 之間的接口。本地的數據庫如 mysql 在 XA 中扮演的是 RM 角色XA 一共分爲兩階段:第一階段(prepare):即所有的參與者 RM 準備執行事務並鎖住需要的資源。參與者 ready 時,向 TM 報告已準備就緒。第二階段 ( ⌘ Read more
【導讀】本文介紹如果通過 bazel 來構建和管理 go 的項目。前言這篇文章主要介紹如果通過 bazel 來構建和管理 go 的項目。這裏是一個最簡單的實例。bazel 是什麼bazel 是一個可以快速構建和測試任意規模軟件的工具,能夠用來編譯 Java,C++,Go,TS,iOS,Android 等大部分的語言。1. 創建工作空間在使用 bazel 的時候,需要先創建一個 WORKSPACE ⌘ Read more
前言--相信各位小夥伴一定看過這樣的言論,某某 B 乎大佬 xxx,發了一堆文字,一定要學好底層,一定要學好C語言!!,然後下面各種擡槓。B 乎大佬:C語言是最牛掰的,一定要從C語言開始學起。槓精張三: 學C有啥用,啥都幹不成,直接學Java,然後上框架,直接開始開發。槓精李四:@槓精張三,你會懂C嗎,瞎胡扯,xxx 一堆理由,反正,C是一定要學的,基礎一定要打好。... 各路槓精大 V 正在趕來 ⌘ Read more
如果您想在每個請求之前和之後執行一些代碼,而不管請求的 URL 是什麼,該怎麼辦呢?例如,如果您希望記錄向服務器發出的所有請求,或者允許跨站調用所有 API,或者確保當前用戶在調用安全資源的處理程序之前已經過身份驗證,該怎麼辦?我們可以使用中間件處理程序輕鬆有效地完成所有這些工作。一箇中間件就是一個 http.handler 對另一個 http.handler 的封裝,實現的功能就是對請求前後做一 ⌘ Read more
布隆過濾器簡介-------布隆過濾器(Bloom Filter)是一個基於 hash 的概率性的數據結構,它實際上是一個很長的二進制向量,可以檢查一個元素可能存在集合中,和一定不存在集合中。它的優點是空間效率高,但是有一定 false positive(元素不在集合中,但是布隆過濾器顯示在集合中)。布隆過濾器原理-------布隆過濾器就是一個長度爲m個 bit 的 bit 數組,初始的時候每個 ⌘ Read more
Go 內存模型明確指出,一個 goroutine 如何才能觀察到其他 goroutine 對同一變量的寫操作。 當多個 goroutine 併發同時存取同一個數據時必須把併發的存取操作序列化。在 Go 中保證讀寫的序列化可以通過 channel 通信或者其他同步原語(例如 sync 包中的互斥鎖、讀寫鎖和 sync/atomic 中的原子操作)。Happens Before在單 goroutin ⌘ Read more
go 的 tcp 看起來是同步請求,實際上被轉成了異步操作,爲什麼這牛逼呢?首先 tcp 連接的接口是 connnet.go 裏面有 conn.Read() 的定義如下:// Read implements the Conn Read method.func (c conn) Read(b []byte) (int, error) { if !c.ok() { return 0, s ⌘ Read more
【導讀】本文介紹了 logrus 日誌庫和與 iris web 框架的結合。 logrus 特性完全兼容 golang 標準庫日誌模塊:logrus 擁有六種日誌級別:debug、info、warn、error、fatal 和 panic,這是 golang 標準庫日誌模塊的 API 的超集。如果您的項目使用標準庫日誌模塊,完全可以以最低的代價遷移到 logrus 上。 可擴展的 Hook ⌘ Read more
Kratos 是一套輕量級 Go 微服務框架,包含大量微服務相關功能及工具。名字來源於遊戲《戰神》,該遊戲以希臘神話爲背景,講述了奎託斯(Kratos)由凡人成爲戰神並展開弒神屠殺的冒險歷程。 寫在前面從 2021 年 2 月份,github 上 kratos v2(下文簡稱 kratos) 版本第一次代碼提交,到功能模塊的討論,修改,測試,最終定稿,已經過去了 13 個月,在社區各位夥伴的貢獻 ⌘ Read more
本文介紹 gin 的一些知識點, 如自定義 Response, 中間件等。 gin--- Gin 是一個 go 寫的 web 框架,具有高性能的優點。初級的使用方式不介紹了,具體請查閱官方文檔。官方地址:https://github.com/gin-gonic/gin以下介紹基於 gin 開發項目的一些常用模塊。自定義 Response------------每個公司都會自定義接口的數據結構。 ⌘ Read more
最近發現知乎上感興趣的問題越來越少,於是準備聚合下其他平臺技術問答,比如 segmentfault、stackoverflow 等。要完成這個工作,肯定是離不開爬蟲的。我就順便抽時間研究了 Go 的一款爬蟲框架 colly。概要介紹colly 是 Go 實現的比較有名的一款爬蟲框架,而且 Go 在高併發和分佈式場景的優勢也正是爬蟲技術所需要的。它的主要特點是輕量、快速,設計非常優雅,並且分佈式的支 ⌘ Read more
早前寫過一篇文章,Go HTTP 請求 QuickStart。當時,主要參考 Python 的 requests 大綱介紹 Go 的 net/http 如何發起 HTTP 請求。最近,嘗試錄成它的視頻,訪問地址 [1]。發現當時寫得挺詳細的,可能是標題沒起好,QuickStart 把文章降低好幾個檔次,發出來後,一個點贊都沒有,傷心的同時,也領悟到了標題的重要性。雖說比較詳細,但也只是介紹用法,可 ⌘ Read more
Go module 是從 Go 1.11 版本才引入的新功能。其目標是取代舊的的基於 GOPATH 方法來指定在工程中使用哪些源文件或導入包。本文首先分析 Go 引入 module 之前管理依賴的優缺點,然後針對這些缺點,看 module 是如何解決的。一、傳統的包管理方式 - package在 Go1.11 之前,如果想要編寫 Go 代碼以及引入第三方包,則需要將源代碼寫在 GOPATH/src ⌘ Read more
什麼是 http 路由-------------------擼過 http 框架的同學都知道,一個 MVC 模型的 http 框架肯定是少不了路由這一塊的,那麼什麼是路由呢。 簡而言之,http 路由即是一條 http 請求的 “嚮導”,根據 URI 上的路徑,指引該條請求到對應的方法裏去執行然後返回,中間可能會執行一些中間件。路由的種類-------------靜態路由 框架 / 用戶提 ⌘ Read more
golang 本地緩存 (bigcache/freecache/fastcache 等) 組件原理總結 提到本地緩存大家都不陌生,只要是個有點經驗的後臺開發人員,都知道緩存的作用和弊端。本篇文章我們就來簡單聊聊在 golang 做業務開發的過程中,本地緩存的一些可選的開源方案。分析它們的特點,以及內部的實現原理。本地緩存需求分析-----------首先來梳理一下業務開發過程中經常面臨的本地緩存 ⌘ Read more
前言--此係列文章要求讀者有一定的 golang 基礎。go-zero 是一個集成了各種工程實踐的 web 和 rpc 框架。通過彈性設計保障了大併發服務端的穩定性,經受了充分的實戰檢驗。go-zero 包含極簡的 API 定義和生成工具 goctl,可以根據定義的 api 文件一鍵生成 Go, iOS, Android, Kotlin, Dart, TypeScript, JavaScript ⌘ Read more
expvar 處理程序提供的默認信息是一個好的開始。但我們可以通過在 JSON 響應中開放一些額外的定製指標來讓它變得更有用。爲了說明自定義性能參數,我們先開始一個簡單的,將應用程序的版本號添加到 JSON 響應中。如果你忘記了,版本號是定義在 main.go 文件中的字符串常量值爲:"1.0.0"。實現的代碼分爲兩個基本步驟:1、使用 expvar 包註冊一個自定義變量。2、需要爲變量賦值。代碼 ⌘ Read more
hi,大家好,我是好久沒有更新的 haohongfan。Go 1.18 終於正式發佈了,本次版本更新中 Go mod 有個很實用的功能 “multi-module workspaces”. 本篇文章簡單介紹下 workspace 的使用方式以及使用場景。更新 go 1.18 版本,推薦使用 goup[1],做多版本管理很方便。Go work 使用方式------------1. 創建一個工作空間m ⌘ Read more
【導讀】本文介紹了在 go 語言中實現 AOP 操作的實踐。golang 如何進行 AOP 操作 怎樣的 AOP 風格最好用 gin 的中間件是如何實現的 前言--我們將一個事件處理標記爲 handler, 那麼 AOP 指代的,就是圍繞這個 handler 的【執行前】【執行後】的切面操作,他可以形象地描述爲: 這種執行流程,容易開發成以下樣式:beforeHandler() ⌘ Read more
當你的應用程序在生產環境中運行並處理實際請求時,如果您正在進行有針對性的負載測試,您可能想要深入瞭解程序是如何執行的,以及它正在使用哪些資源。例如,你可能想回答以下問題:應用程序使用了多少內存?如何隨着時間變化的? 有多少 goroutine 在使用?如何隨着時間變化的? 有多少數據庫連接在使用中,有多少是空閒的?需要更改連接池設置嗎? HTTP 成功響應客戶端和服務器錯誤的比率 ⌘ Read more
前兩天,使用 Golang 實現了一個簡單的 HTTP Proxy,具體實現參見 5 分鐘用 Go 語言 (Golang) 實現一個 HTTP 代理(Proxy),公衆號上通過歷史消息查看。這次使用 Golang 實現一個 Socket5 的簡單代理。Socket5 和 HTTP 並沒有太大的不同,他們都可以完全給予 TCP 協議,只是請求的信息結構不同,所以這次我們不能像上次 HTTP Prox ⌘ Read more
大家好,我是程序員幽鬼。先介紹一下背景知識。使用 Dolt[1],你可以push和pull本地 MySQL 兼容的數據庫到遠程。遠程可以使用 dolt remoteCLI 命令進行管理,它支持多種類型的 remotes[2]。你可以將單獨的目錄用作 Dolt 遠程、s3 存儲桶或任何實現ChunkStoreService protocol buffer 定義的 grpc 服務。remotesrv是 ⌘ Read more
推薦理由 服務探活在現實場景中應用廣泛,比如:服務發現、服務負載均衡、服務調度、服務狀態監控等。然而,“探活” 往往是作爲一個功能模塊或者組件集成在各個平臺系統中。本次要介紹的 easeprobe 是一款輕量級的,可獨立運行的探活工具,利用 easeprobe,無需其他系統支持,就可以對多種類型的服務 / 中間件等探活。功能介紹easeprobe 除基礎的探活功能外,還支持消息通知和定時發送 S ⌘ Read more
哈嘍,大家好,我是 Go 大叔,專注分享 Go 語言知識,一起進入 Go 的大門。 大叔和身邊一羣大牛都無限看好 Go 語言,現在開始搞 Go 語言,過兩年大概就是第一批喫螃蟹的人。面向對象基本概念--------面向對象思想面向對象 (Object Oriented,OO) 是軟件開發方法 面向對象是一種對現實世界抽象的理解,是計算機編程技術發展到一定階段後的產物 Object O ⌘ Read more
項目中需要使用一個簡單的定時任務調度的框架,最初直接從 GitHub 上搜了一個 star 比較多的,就是 https://github.com/robfig/cron,目前有 8000+ star。剛開始使用的時候發現問題不大,但是隨着單機需要定時調度的任務越來越多,高峯期差不多接近 500QPS,隨着業務的推廣使用,可以預期增長還會比較快,但是已經遇到 CPU 使用率偏高的問題,通過 ppro ⌘ Read more
大家好,我是煎魚。關於 Go 的 GMP 調度模型,我們之前寫過一篇《Go 羣友提問:Goroutine 數量控制在多少合適,會影響 GC 和調度?》進行深入講解和分析。當時有同學提出瞭如下問題:GPM 模型中,M 的實際數量,多或少受什麼因素的限制呢?作爲一隻鴿魚,今天就給大家來講講,明確這一個小細節點。回顧--之前有提到 Go 的調度模型離不開一個家庭裏三個兄弟的互相協作,我們在此進行簡單的回 ⌘ Read more
一. 背景衆所周知,Kafka[1] 是 Apache 開源基金會下的明星級開源項目,作爲一個開源的分佈式事件流平臺,它被成千上萬的公司用於高性能數據管道、流分析、數據集成和關鍵任務應用。在國內,無論大廠小廠,無論是自己部署還是用像阿里雲提供的 Kafka 雲服務,很多互聯網應用已經離不開 Kafka 了。 互聯網不拘泥於某種編程語言,但很多人不喜歡 Kafka 是由 Scala/Java 開發 ⌘ Read more
上一篇文章介紹 CORS 原理,現在讓我們對 API 服務做一些修改,放開同域策略,這樣 JavaScript 就可以從 API 接口讀取響應了。首先,最簡單的實現方法是在所有 API 響應中設置以下 header:Access-Control-Allow-Origin: Access-Control-Allow-Origin 響應頭用於指示瀏覽器可以與不同的域共享返回數據。在本例中,header ⌘ Read more
【導讀】本文從一個實際線上問題出發,介紹了由 slice 引發的內存泄漏與其內存分配機制。最近項目開發中遇到一個問題:在程序中大量使用 golang slice 導致內存佔用暴漲。經過一番分析與定位最終解決了問題,把過程記錄下來與大家分析。問題現象-------程序正常運行中突然出現內存佔用飆升,使用 htop 命令查看,程序內存佔用排第一; 使用 free -m 命令查看,發現可用內存爲 ⌘ Read more
在接下來的文章中,我們將討論一個全新的主題,並更新我們的應用程序,使其支持來自 JavaScript 的跨域請求 (CORS: Cross-origin resource sharing))。你將學習到:什麼是跨域請求,爲什麼瀏覽器默認阻止跨域請求。 普通請求和跨域請求之間的區別。 如何使用 Access-Control 請求頭來允許或拒絕特定的跨域請求。 考慮到安全因素,你需要 ⌘ Read more
neovim 從 vim 專案 fork 之後,新增了 async 功能,所有工作不會再被單一線程給擋住 (在過去 linter 檢查時,是無法寫程式碼的),大大提升了可用性和使用者體驗,朝現代編輯器躍進了一大步。neovim 並沒有因此停下腳步,在之後的版本陸續推出了remote plugin:使得寫 plugin 不在受限於 vimscript,可以使用其他語言並且基於 client serv ⌘ Read more
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。 歡迎大家加入 Go 招聘交流羣,來這裏找志同道合的小夥伴!跟土撥鼠們一起交流學習。例 1:Goroutine 泄漏----------------現象NumGoroutine 指標持續上漲,且低峯期未下降,判斷出現了 Goroutine 泄漏現象。排查通過訪問線上服務 pprof 暴露出來的 ⌘ Read more
爭做團隊核心程序員,關注「幽鬼」Go1.18 已經發布了,泛型終於正式進入了 Go 語言。那泛型將如何影響性能?讓我們通過對幾個用例進行基準測試來弄清楚。圖片圖片由 Percy Bolmér 拍攝。Takuya Ueda 的 Gopher,Renée French 的原創 Go Gopher(CC BY 3.0) 關於 Go1.18 新特性的文章有很多,討論也不少。其中一個討論是我想寫的一個主題 ⌘ Read more
【導讀】本文詳細介紹了 go 語言實現羣聊、廣播服務的實戰。其實從上學開始就一直想寫一個 im。最近深入 go,真是學會了太多,感覺人森雖然苦短,但是也不能只用 python。很多知識是不用編譯型語言無法瞭解的。該來的還是會來,現在會一步一步用 go 把這個服務器完善起來 先從這個 demo 開始。這個 demo 我們要求所有連上服務器的用戶都會知道有用戶的離開,有用戶的加入 (除了第一個加入的用 ⌘ Read more
現如今提起網絡大家的第一反應就是 epoll,而實際工程開發中絕大部分的情況都會優先考慮採用已有的一些開源網絡框架來做功能的開發。網絡框架不同的語言有不同的實現,例如 java 中大名鼎鼎的 netty,再比如 c++ 中的 libevent、boost::asio、muduo 等,golang 中目前在開源社區比較有影響力的網絡框架有 gnet、evio、netpoll(字節開源) 這幾個。 ⌘ Read more
大家好,我是明哥。今天來安利一個非常好用的開發技巧,我們經常在使用一些工具時,查看工具的版本的時候,時常能看到版本信息非常多,連 git 的 commit id 都有。~ ➤ docker versionClient: Cloud integration: v1.0.22 Version: 20.10.11 API version: 1.41 Go version: ⌘ Read more
上一篇文章我們的權限模型和權限檢查中間件已經可以正常運行了。但此時,當新用戶註冊一個帳戶時,他們沒有任何權限。在本節中,我們將修改這個設置,使新用戶在默認情況下自動被授予 “movies:read” 權限。更新權限模型爲了給用戶授予權限,我們需要更新 PermissionModel,添加 AddForUser() 方法,爲用戶添加一個或多個權限碼到數據庫中。我們的想法是,按以下方式在處理程序中使用 ⌘ Read more
我們寫一個 grpc 服務的時候,grpc 服務註冊流程如下baseServer = grpc.NewServerxxpb.RegisterxxServiceServer(baseServer, xxServer)下面我們以健康檢查爲例,分析下服務註冊的邏輯func RegisterHealthServer(s grpc.ServiceRegistrar, srv HealthServer ⌘ Read more=
PostgreSQL 是一個自由的對象 - 關係數據庫服務器 (數據庫管理系統),它在靈活的 BSD - 風格許可證下發行。它提供了相對其他開放源代碼數據庫系統 (比如 MySQL 和 Firebird),和對專有系統比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server 的一種選擇。PostgreSQL 和 MySQL 比較,它更加龐大一點,因爲它是用 ⌘ Read more
前言--Hey, 大家好呀, 我是碼農, 星期八。這次呢, 咱們來實現一個簡單的 TCP 端口掃描器!也來體驗一下黑客的風采!TCP 掃描本質--------我們在使用 TCP 進行連接時, 需要知道對方機器的ip:port正常握手連接成功的話, 流程如下。連接失敗 有正常, 就有失敗, 如果被連接方關閉的話, 流程如下。如果有防火牆 還有一種可能是, 端口開放, 但是防火牆攔截, 流程如下。 ⌘ Read more
文件處理是一個常見的問題,同時 Go 又提供了非常多的文件讀取方法,容易讓人患選擇困難症。之前我們轉過一篇超全總結:Go 讀文件的 10 種方法的文章,列舉了 10 餘種讀取方式。本文作爲其擴展,以實際不同大小的文件爲例,來具體比較下它們的差異。 創建不同大小的文件---------首先,我們需要有比較對象。鑑於電腦磁盤空間有限,本文就比較 KB、MB、GB 三個級別的文件讀取差異。packag ⌘ Read more
【導讀】本文用詳細例子介紹了 Rest API 的項目實現。⒈ 從 0 開始在實現動態 API 之前,先來實現一個簡單的靜態頁面渲染package mainimport ( "fmt" "log" "net/http")func homePage(w http.ResponseWriter, r http.Request) { fmt.Fprint(w, "HomePag ⌘ Read more
【導讀】本文介紹依賴注入庫 dig。一、簡介go 是否需要依賴注入庫曾經是一個飽受爭議的話題。實際上是否需要依賴注入,取決於編程風格。依賴注入是一種編程模式。比較適合面向對象編程,在函數式編程中則不需要。go 是一門支持多範式編程的語言,所以在使用面向對象的大型項目中,還是建議按照實際情況判斷是否應該使用依賴注入模式。二、主流的依賴注入庫依賴注入實現的是一件很小的事情,所以單純實現依賴注入的軟件包 ⌘ Read more
如果想要深入瞭解 Go 語言,Go 彙編是一個繞不過的環節。本文以 Go 官方文檔 A Quick Guide to Go's Assembler 爲基礎對 Go 彙編進行介紹。Go 彙編是在 Plan 9 彙編的基礎上進化出的新版本。如果需要進一步深入學習,還是建議閱讀 A Manual for the Plan 9 assembler 。關於 Go 的彙編,最重要的一點是它不是底層機器碼的直接 ⌘ Read more
淨是拿比自己弱的人當對手,不可能有意思。沒有人能一看到謎題就瞬間解出答案。讀到一半就知道犯人的推理小說真是無聊透頂。將自身能力發揮至極限去解開問題,這時才能把知識變成自己的東西。 —青木峯郎《Ruby 源代碼完全解讀》 當我們對 Go 程序進行性能分析時,一般想到的方式是 Pprof 提供的一系列工具分析 CPU 火焰圖、內存佔用。誠然,通過分析 cpu 耗時最多的流 ⌘ Read more
今天的文章來自於最近的 Go 代碼測試。請看下面的基準測試代碼。1func BenchmarkSortStrings(b testing.B) { s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"} b.ReportAllocs() for i := 0; i < b.N; i++ ⌘ Read more
【導讀】本文詳細介紹了 go 語言 context 的使用。爲什麼需要 contex?-------------在任何語言編程過程中, 都希望有一個上下文對象記錄全局需要的變量信息以及控制信息, 例如下面的例子:func main() { messages := make(chan int, 10) done := make(chan bool) defer close(mess ⌘ Read more
【導讀】本文介紹了 Go 實現微服務網管的實踐。在最近的一個項目中,採用了微服務架構 -go-kit進行後端的開發。在微服務架構風格中,一個大應用被拆分成爲了多個小的服務系統提供出來,這些小的系統他們可以自成體系,也就是說這些小系統可以擁有自己的數據庫,框架甚至語言等,因此我們需要設計一個 API 網關(API Gataway),其實網上已經有較多現成的實現框架,但是本項目的需求是比較簡單的,因此 ⌘ Read more
語法解析一個非常重要的功能就是要構建一個樹形數據結構,也叫語法解析樹,無論是解釋器執行當前語句還是編譯器將語句轉換爲低級語言,解析樹都是一個承上啓下的重要結構。對任何生產式 A - X Y Z,它都會生成一個以 A 爲父節點,X,Y,Z 爲子節點的多叉樹,而且 X,Y,Z 作爲節點出現的順序與他們在生產樹中出現的位置一樣,如下圖所示: 所有非終結符都會成爲解析樹的中間節點,而所有終結符都會 ⌘ Read more
上一篇文章實現了客戶端通過發送認證信息獲得身份驗證 token,那麼讓我們看看如何使用該 token 來驗證用戶,實現服務端準確地知道請求來自哪個用戶。本質上,一旦客戶端有了一個認證 token,後續訪問 API 服務時後端服務將從客戶端 Authorization 請求頭中獲取 token,像這樣: Authorization: Bearer IEYZQUBEMPPAKPOAWTPV6YJ6RM ⌘ Read more
JSON----基本上從以下兩種角度進行分析性能方面,如是否使用反射;是否支持 Unmarshal 到 map 或 struct,未涉及靈活性與擴展性方面,下面報告中只考慮最簡單的反序列化,不會提及每個庫的靈活性,如提供的一些定製化抽取的 API;相關庫GO 1.14 標準庫 JSON 大量使用反射獲取值,首先 go 的反射本身性能較差,其次頻繁分配對象,也會帶來內存分配和 GC 的開銷;val ⌘ Read more
大概 2 年前,碰巧學習區塊鏈(Hyperledger Fabric),便寫了一個入門級的項目放在 GitHub 上,公衆號有不少讀者是通過這個項目關注到我的,也經常問我,有沒有區塊鏈這方面的學習資料,有沒有這個項目的詳細講解,如何搭建一個區塊鏈網絡,林林總總。對於這些問題,我每次的回覆都一樣,學習資料我倒是沒有,但是 官方文檔 [1] 就是最好的資料了。不過今天,我想還是通過這篇文章來記錄一下我 ⌘ Read more
哈嘍,大家好,我是 Go 大叔,專注分享 Go 語言知識,一起進入 Go 的大門。 大叔和身邊一羣大牛都無限看好 Go 語言,現在開始搞 Go 語言,過兩年大概就是第一批喫螃蟹的人。歡迎大家來到『Go 語言入門到精通』這個專欄,今天是專欄第 16 篇,大叔主要和大家分享一下 Go語言數組與切片相關的知識點。 Go 語言入門到精通 Go 語言入門到精通,專注分享 Go 語言硬核編程知識。 1 ⌘ Read more
panic 能中斷一個程序的執行,同時也能在一定情況下進行恢復 (recover)。我們就來看一看 panic 和 recover 這對關鍵字的實現機制。根據我們對 Go 的實踐,可以預見的是,他們的實現跟 runtime 調度器和 defer 關鍵字也緊密相關。思考爲什麼 go 進程會終止---------------func main() { panic("sim lou.")}輸出結果是:p ⌘ Read more
【導讀】本文介紹了幾種 go 負載均衡算法。引子--負載均衡被廣泛運用在各種編排系統,微服務網關,Nginx/HAProxy 作爲前置的網站集羣等等場所。在看不到的更多領域,甚至於你所想象不到的,從未注意過的一些場所,負載均衡也以不同的面目在出沒着,例如機械硬盤、硬盤組的讀寫訪問,多核 CPU 的管線分配等等等等。所以說負載均衡這種技術,以優化資源運用,最大化吞吐率,最小訪問時延,防止過載爲目標, ⌘ Read more
這篇文章記錄一次給 gin-gonic/gin[1] 提交了一行代碼的經歷,雖然沒什麼含金量,但是對我而言還是挺開心的哈哈。緣由事情是這樣的,gin 默認的 404 頁面返回的是 404 page not found ,我們項目中需要自定義該頁面進行跳轉,第一直覺肯定是 gin 會有相應的 API ,事實如此,gin 有一個 NoRoute 方法可以自定義 404 頁面的 handler ,它的源 ⌘ Read more
接下來的幾篇文章,我們將看看如何對 API 服務的請求進行認證,以便我們準確地知道一個請求來自於哪個用戶。 記住:認證是關於確認用戶是誰,而授權是檢查用戶是否有權做某些事情。我們將:介紹可用的 API 身份驗證方法,並討論它們的優缺點。 實現一種基於 token 的有狀態認證模式,允許客戶端交換他們的用戶憑證,以獲得一個有時間限制的身份驗證 token 來識別用戶。 認證機制---- ⌘ Read more
大家好,我是程序員幽鬼。分享一個工具包:goutil/dump。這是一個 golang 數據打印工具包,可以打印漂亮易讀的 go slice、map、struct 數據。主要特性有:dump.P(vars…)使用簡單,直接調用即可 支持所有基本數據類型。 支持切片、map 和結構體數據結構。 支持傳遞和打印多個變量 默認輸出調用位置,使用方便 支持自定義功能,例如縮進 ⌘ Read more
原文鏈接:https://www.yipwinghong.com/2021/08/04/Goengineering-standard目錄 項目結構 標準項目結構 工具包項目結構 服務應用項目結構 生命週期 API 設計 gRPC 目錄結構 兼容性 命名規範 原始字段 異常處理 設計規則 配置管理 最佳實踐 ⌘ Read more
negroni 本身是一箇中間件,不過它也提供了拓展,以幫助我們更簡單地實現自己想要的功能的中間件。那麼,我們究竟該如何實現中間件,才能能夠封裝到 negroni 中,從而通過 negroni 來調用呢?可以通過一個簡單的例子分析:package mainimport ("fmt""net/http""github.com/urfave/negroni""github.com/phyber/neg ⌘ Read more
大家好,我是浩然,網名 “磊磊落落”。專注 Golang、算法、DevOps、PostgreSQL 及雲原生,想學新技術,關注我就對了! https://leileiluoluo.com採用常規方式啓動一個 Golang http 服務時,若服務被意外終止或中斷,即未等待服務對現有請求連接處理並正常返回且亦未對服務停止前作一些必要的處理工作,這樣即會造成服務硬終止。這種方式不是很優雅。 ⌘ Read more
一、分佈式 id 生成器------------在高併發場景中,通常需要類似 MySQL 自增 id 一樣不斷增長且不會重複的 id。比如某電商雙 11 時,在 0:00 開始,會有千萬到億級的訂單湧入,每秒要處理 10w+ 的訂單。在將訂單插入數據庫前,我們需要給訂單一個唯一的 id 再插入數據庫內。也正因爲訂單量大,一個無意義的純數字 id 在對數據庫進行增刪改查時不能起到優化作用。此 id ⌘ Read more
Go 語言的路由庫有很多,功能上都大同小異,最大的差異應該是路由函數的簽名,官方採用了 http.Handler 接口,而大部分非官方路由都將 http.ResponseWriter 和 http.Request 合併成了一個對象。本文介紹的庫 https://github.com/issue9/mux 利用 go1.18 對泛型的支持,實現了用戶自定義該功能的需求,僅需要幾步即可實現一個完善的路 ⌘ Read more
作者:dablelv,騰訊 IEGggG 後臺開發工程師 代碼的穩健、可讀和高效是我們每一個 coder 的共同追求。本文將結合 Go 語言特性,爲書寫效率更高的代碼,從常用數據結構、內存管理和併發,三個方面給出相關建議。話不多說,讓我們一起學習 Go 高性能編程的技法吧。常用數據結構1. 反射雖好,切莫貪杯標準庫 reflect 爲 Go 語言提供了運行時動態獲取對象的類型和值以及動態創建對象 ⌘ Read more
導語 \\| Golang 核心開發人員、goroutine 調度的設計者 Dmitry Vyukov,在 2019 年的一個 talk 裏深入淺出地闡述了 goroutine 調度的設計思想以及一些優化的細節。本文是筆者結合自身經驗和認知的一點觀後感,採用從零開始層層遞進的方法,總結剖析了其背後的軟件設計思想,希望對讀者更好地理解 goroutine 調度 GMP 模型會有所幫助。前言視頻地址:ht ⌘ Read more
上一篇文章創建了 token 數據庫表,而我們激活過程的完整性取決於一件關鍵的事情:發送到用戶郵箱的 token(稱爲令牌)具有 “不可猜測性”。如果令牌很容易被猜到或可以被暴力破解,那麼攻擊者就有可能激活用戶帳戶,即使他們無法訪問用戶的郵箱。因此,需要生成的 token 具有足夠的隨機性,不可能被猜出來。在這裏我們使用 Go 的 crypto/rand 包 128 位(16 字節)墒。如果你跟隨 ⌘ Read more
Golang 併發基礎問題一(通信過程選用值接收類型)世人常說,這世間最簡單的併發便是 Golang,只需一個 go 關鍵字即可實現,於是我滿心歡喜的去迎,卻不曾想陷入萬丈深坑,我便是知道,若當真是極好學的,也萬萬輪不到我,我哪裏比得上他們這些厲害人物,我原就是給他們取笑的。嗚嗚嗚嗚嗚嗚嗚……切入今天的正題:用一個簡潔的實例看看,其中 n 代表線程數;(初學時,只覺腦中混混沌沌,不知所云,外層 ⌘ Read more
原文地址:https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html 原文作者:William Kennedy序言這個系列包含四篇文章,主要講解 Go 言語指針、棧、堆、逃逸分析和值 / 指針語義背後的機制和設計理念。這是系列第一篇文章,主要講解棧和指針。介紹我並不打算爲指針說 ⌘ Read more
前言Hey,大家好呀,我是星期八,這次咱們繼續學習 Go 基礎之數組扒。什麼是數組-----我的總結:一個變量,指向一塊連續的,具有長度的,並且是相同類型的一塊內存。如何定義數組------var 變量名 [元素個數]元素類型示例: package mainfunc main() { //聲明一個namelist數組,長度爲100,裏面只能放字符串 var namelist [100 ⌘ [Read more](https://www.readfog.com/a/1663446597381492736)
Gin 的中間件,本質是一個匿名回調函數。這和綁定到一個路徑下的處理函數本質是一樣的。再以 Engine 的 Default 方法爲例func Default() Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine}第 4 行就讓該 Engine 使用了 ⌘ Read more=
如果有個 Go 開發需求:獲取主機的硬盤、CPU、內存、進程等使用情況,你會怎麼做?比較樸素的想法是通過 os/exec 去執行某些例如 ps、cd、top 命令,之後解析它們的執行結果。當然,基於 Linux 的一切皆文件思想,更直接地做法是去讀取相關文件內容,例如 /proc 目錄下的文件。上面的方式能夠完成需求,但是我們大不必重複造輪子,因爲已經有相當完善的三方庫爲我們實現了這些採集需求,它 ⌘ Read more
微信 v3 #### 推薦使用 v3 接口,官方在 v3 接口實現未覆蓋或 gopay 未開發的接口,還繼續用 v2 接口,歡迎參與完善 v3 接口。已實現 API 列表附錄:API 列表附錄 微信官方文檔:官方文檔 接口規則:平臺證書 接入規範:最佳實踐 GoPay 微信 v2 文檔:GoPay 微信 v2 文檔 (部分接口僅 v2 版本支持) 1、初始化微信 v ⌘ Read more
【背景】 在 golang 中,協程被認爲是輕量級的線程。 和線程不同的是,操作系統內核感知不到協程的存在,用戶態的協程依賴 golang 運行時自身提供的調度器進行管理。同時,golang 中的協程是從屬於某個線程的,協程和線程的對應關係爲 M:N,即多對多,golang 語言調度器可以將多個協程調度到一個線程中,一個協程也可能切換到多個線程執行。 那麼,爲什麼 ⌘ Read more
【思考】 ● 併發程序難在哪裏?我們在上一篇文章 Go 協程與併發機制(一)進程與線程中,從進程和線程的關係,講到多線程與多核 CPU 的關係,再回歸到併發和並行的定義。到這裏我們可以想想寫一個併發程序究竟會遇到什麼困難,線程這樣的工具會完美解決這樣的問題麼?線程的出現很好解決了早期互聯網發展後帶來的多用戶問題,如果一個用戶要起一個進程,進程間需要共享資源還得通過進程間的通信機制, ⌘ Read more
【概念】 進程和線程都是操作系統所要管理的對象。 線程是操作系統能夠進行運算調度的最小單位。大部分情況下,它被包含在進程之中,作爲進程的實際運作單位。而進程是程序運行的實例。【圖示】Fig.1 進程內部結構 在多線程程序中,一個單獨進程會有少到幾個,多到上百個線程協同工作;每個線程擁有屬於他們自己的程序計數器(指向當前指令的內存),棧,以及 TLS(線程本地內存 ⌘ Read more
我是一隻可愛的土撥鼠,專注於分享 Go 職場、招聘和求職,解 Gopher 之憂!歡迎關注我。 歡迎大家加入 Go 招聘交流羣,來這裏找志同道合的小夥伴!跟土撥鼠們一起交流學習。相信模糊測試大家已經很熟悉了,還沒開始使用的同學可以看看官方的教程 https://go.dev/doc/tutorial/fuzz 和煎架寫的這篇我要提高 Go 程序健壯性,Fuzzing 來了!。今天小土給大 ⌘ Read more
本篇瞭解 Redis 的消息訂閱,以及用 Go 實現消息訂閱功能。 Redis 訂閱--------訂閱頻道 [root@iZwz9d74mj3se01z97vymxZ ~]# redis-cli -p 6379127.0.0.1:6379 SUBSCRIBE chatroomReading messages... (press Ctrl-C to quit)1) "subscribe ⌘ Read more
go 語言提供了一種開箱即用的共享資源的方式,互斥鎖 (sync.Mutex), sync.Mutex 的零值表示一個沒有被鎖的,可以直接使用的,一個 goroutine 獲得互斥鎖後其他的 goroutine 只能等到這個 gorutine 釋放該互斥鎖, 在 Mutex 結構中只公開了兩個函數,分別是 Lock 和 Unlock,在使用互斥鎖的時候非常簡單,本文並不闡述使用。在使用 sync. ⌘ Read more
原文鏈接:https://hongker.github.io/2021/03/31/golang-di/本文介紹在 golang 中如何通過依賴注入 (Dependency Inject,簡稱 DI) 管理全局服務。什麼是 DI------ 把有依賴關係的類放到容器中,解析出這些類的實例,就是依賴注入。DI 的作用------反面例子現在我們有一個 http 應用,先來看下常規開發的 main. ⌘ Read more
前言\\-\\- 哈嘍,大家好,我是asong。option編程模式大家一定熟知,但是其寫法不唯一,主要是形成了兩個版本的option設計,本文就探討一下其中的優缺點。option編程模式的引出---------------在我們日常開發中,經常在初始化一個對象時需要進行屬性配置,比如我們現在要寫一個本地緩存庫,設計本地緩存結構如下:type cache struct { // hashFunc rep ⌘ Read more