原创 Gin框架中使用JWT認證

JWT是什麼 JSON Web Token (JWT) 是一個開放標準 (RFC 7519),它定義了一種緊湊、獨立的方式,可以用 JSON 對象在雙方之間安全地傳輸信息。由於經過了數字簽名,因此這些信息是可以驗證和信任的。JWT 可以使

原创 使用SQL 統計表最大值,最小值,平均值,中位數值

問:有一個postgres數據表,表中有update_time, create_time關於時間戳的字段,選擇某個時間段,計算出update_time減去create_time的值做爲耗時時間的字段duration_time,統計出在這段

原创 Go內存管理逃逸分析

1. 前言 所謂的逃逸分析(Escape analysis)是指由編譯器決定內存分配的位置嗎不需要程序員指定。 函數中申請一個新的對象 如果分配在棧中, 則函數執行結束後可自動將內存回收 如果分配在堆中, 則函數執行借宿可交給GC(垃圾

原创 gorm操作sqlite3,高併發讀寫如何避免鎖庫?

1. 場景 這兩天一直被這個sqlit3困擾,起因是項目中需要有這樣一箇中間,中間件承擔着API角色和流量轉發的角色,需要接收來自至少300個agent的請求數據,和健康檢測的請求。 所以當即想到用go來實現,因爲數據教訓,不考慮使用pg大

原创 golang編譯最小可執行文件

前言 我們在使用go語言時,最方便莫過於將編譯好的二進制文件直接拷貝到服務器中運行即可,但是隨着代碼工程的複雜可能導致二進制文件很大,這會造成傳輸過程的時間成本變大,如果在頻繁構建,發佈中,無疑會增加一些成本,所以有時候考慮將二進制文件編譯

原创 Go構建遇到cgo動態庫時解決方案

1. 問題 golang構建程序很簡單,當遇到需要調用c庫時,如通常使用 net,kafka, sqlite3 程序運行時就會調用當前服務器的 動態庫,如果遇到沒有庫時,通常還需要 下載比如 alpine需要安裝sqlite apk

原创 2. Go中defer使用注意事項

1. 簡介 defer 會在當前函數返回前執行傳入的函數,它會經常被用於關閉文件描述符、關閉數據庫連接以及解鎖資源。 理解這句話主要在三個方面: 當前函數 返回前執行,當然函數可能沒有返回值 傳入的函數,即 defer 關鍵值後面跟的是一

原创 3. Go中panic與recover注意事項

1. 前言 Go 語言中兩個經常成對出現的兩個關鍵字 — panic 和 recover。這兩個關鍵字與上一節提到的 defer 有緊密的聯繫,它們都是 Go 語言中的內置函數,也提供了互補的功能。 需要說明兩點 panic 能夠改變

原创 十二. Go併發編程--sync/errGroup

一.序 這一篇算是併發編程的一個補充,起因是當前有個項目,大概の 需求是,根據kafka的分區(partition)數,創建同等數量的 消費者( goroutine)從不同的分區中消費者消費數據,但是總有某種原因導致,某一個分區消費者創建失

原创 Go知識盲區--閉包

1. 引言 關於閉包的說明,曾在很多篇幅中都有過一些說明,包括Go基礎--函數2, go 函數進階,異常與錯誤 都有所提到, 但是會發現,好像原理(理論)都懂,但是就是不知道如何使用,或者在看到一些源碼時,依然一頭霧水。 剛好今天看到了一篇

原创 Go 性能提升tips--邊界檢查

1. 什麼是邊界檢查? 邊界檢查,英文名 Bounds Check Elimination,簡稱爲 BCE。它是 Go 語言中防止數組、切片越界而導致內存不安全的檢查手段。如果檢查下標已經越界了,就會產生 Panic。 邊界檢查使得我們的代

原创 十一. Go併發編程--singleflight

一.前言 1.1 爲什麼需要Singleflight? 很多程序員可能還是第一次聽說,本人第一次聽說這個的時候以爲翻譯過來就是程序設計中被稱爲的是 "單例模式"。 google之後二者天壤之別。 一般情況下我們在寫一寫對外的服務的時候都

原创 十.Go併發編程--channel使用

一.設計原理 Go 語言中最常見的、也是經常被人提及的設計模式就是: "不要通過共享內存來通信,我們應該使用通信來共享內存" 通過共享內存來通信是直接讀取內存的數據,而通過通信來共享內存,是通過發送消息的方式來進行同步。 而通過發送消息

原创 九. Go併發編程--context.Context

一. 序言 1.1 場景一 現在有一個 Server 服務在執行,當請求來的時候我們啓動一個 goroutine 去處理,然後在這個 goroutine 當中有對下游服務的 rpc 調用,也會去請求數據庫獲取一些數據,這時候如果下游依賴的

原创 八. Go併發編程--errGroup

一. 前言 瞭解 sync.WaitGroup的用法都知道 一個 goroutine 需要等待多個 goroutine 完成和多個 goroutine 等待一個 goroutine 幹活時都可以解決問題 WaitGroup 的確是