原创 從main入口開始談golang

一、問題 1.我們知道一個可獨立運行的golang程序,一定要有個main.main(),因爲main()是程序的入口。可你知道爲什麼一定要求是main.main()嗎? 2.main()在執行前,根據package的初始化順序,

原创 記一次gin PostForm bug

bug說明及分析 Gin master分支在20190602-20190612期間的版本,存在通過c.PostForm獲取form中的參數有誤的bug。 此bug在有一定併發時,由於複用之前的連接而未清除之前的緩存,導致獲取的參數

原创 golang map轉json的順序問題

我們都知道map是無序的,每次取出key/value的順序都可能不一致,但map轉json的順序是不是也是無序的嗎?儘管json中的參數順序大部分情況下對使用沒有影響,我們不妨看看源碼中怎麼處理的。 先說結論: map轉json是

原创 深入瞭解Go flag

一、前言 flag主要用以對命令行工具的參數的解析獲取,其源碼位於/flag/flag.go中。 二、flag使用 flag一般使用方法: (1)聲明變量並綁定 有兩種方式: ①Var形式 var ( _para1 str

原创 深入瞭解gorm Scan的使用

前言 在使用gorm查詢數據保存時,可以通過Scan快速方便地將數據存儲到指定數據類型中,減少數據的手動轉存及賦值過程。 使用示例: type Result struct { Name string Age in

原创 Go字符串拼接方式深入比較

前言 Go中字符串的拼接主要有"+"、fmt.Sprintf+%s、strings.Join等方式,已經有很多人從耗時的角度比較這些方式的性能,本文則從源碼的角度去分析下這些方式的實現方式,再去比較性能。 拼接字符串方式 "+"

原创 優雅重啓Go服務——gracehttp詳解

前言 grace是facebook公司爲golang服務開發的優雅重啓和零停機部署的開源庫。可以實現服務重啓時,舊有連接不斷,新服務啓動後,新連接連入新服務,如此客戶端無感知。 使用方法 (1)獲取 go get github.

原创 瞭解Go編譯處理(一)—— go tool

前言 博主在查找一些Go內置的關鍵字(如make、append等)的具體實現源碼時,發現網上的部分說明只直接提到了源碼位於哪個package等,並未提及緣由。對應package內的源碼中的func又是怎麼被調用?這些都是讓人疑惑

原创 zap細節拾遺——日誌信息內容的具體順序問題

前言 在之前的篇章中主要按照幾個核心使用點進行源碼的分析,有些細節未能覆蓋到,因此對使用時可能需要注意的細節補充說明下。 輸出日誌信息內容的key具體順序問題 先說結論,先後順序爲: Level-Time-LoggerName-C

原创 深入瞭解Go Slice(一)—— make的詳細處理過程

前言 數組(Array)是一個由固定長度的特定類型元素組成的序列,一個數組可以由零個或多個元素組成。因其長度的不可變動,數組在Go中很少直接使用。作爲替代是Slice(切片),它是可以增長和收縮的動態序列,Slice功能也更靈活,

原创 golang中RSA、HASH等常用加/解密、簽名/驗籤方式的封裝處理

前言 我在前文golang中關於RSA加密、解密、簽名、驗籤的通用處理方式中初步封裝了一個RSA相關的加/解密、簽名/驗籤的通用處理方案,也提到了進一步封裝更多加解密方式可能,此次就特意添加了針對DES、AES、HMAC、HASH

原创 beego源碼分析(三)——瞭解

瞭解-路由及controller的處理過程 在初探和起源中我們知道了基本原理、初始化及啓動時的處理,本節主要探究controller的大致處理過程。 一、系統路由及controller func信息的存儲大致過程 在初探裏我們列出

原创 深入瞭解Go Slice(三)—— append的處理過程

前言 深入瞭解Go Slice(一)—— make的詳細處理過程 深入瞭解Go Slice(二)—— 切片的詳細處理過程 這兩篇文章分別介紹了從make、array/slice切片構造slice的具體底層處理過程,本文則介紹通過a

原创 beego源碼分析(一)——初探

初探 前言 我在http.ListenAndServe相關源碼簡析時最後的兩條總結: 1.http.HandleFunc將pattern及我們自定義的handler存儲在DefaultServeMux的一個map中。 2.當htt

原创 深入瞭解Go Slice(二)—— 切片的詳細處理過程

前言 Slice由3部分組成:指針、長度和容量,指針指向的底層數組,長度是當前容納的數據長度,容量是能容量數據的最大長度。 其結構如下: // runtime/slice.go type slice struct { ar