Skip to content

Go Code Snippets ​

Get Go Version of Go-Built Binary without Go ​

bash
strings aaa | grep '^go1\.'

Stdin Lines ​

go
scanner := bufio.NewScanner(os.Stdin)
for {
	scanner.Scan()
	text := scanner.Text()
	if len(text) == 0 {
		break
	}
	// text ...
}

Memory Usage ​

go
type MemoryInfo struct {
	RSS     float64
	Shared  float64
	Private float64
}

func GetMomoryInfo() (*MemoryInfo, error) {
	buf, err := ioutil.ReadFile("/proc/self/statm")
	if err != nil {
		return nil, fmt.Errorf("read statm: %w", err)
	}

	fields := strings.Split(string(buf), " ")
	if len(fields) < 3 {
		return nil, errors.New("cannot parse statm")
	}

	rss, err := strconv.ParseInt(fields[1], 10, 64)
	if err != nil {
		return nil, fmt.Errorf("parse rss: %w", err)
	}

	shared, err := strconv.ParseInt(fields[2], 10, 64)
	if err != nil {
		return nil, fmt.Errorf("parse shared: %w", err)
	}

	pageSizeKB := float64(os.Getpagesize()) / 1024

	return &MemoryInfo{
		RSS:     float64(rss) * pageSizeKB,
		Shared:  float64(shared) * pageSizeKB,
		Private: float64(rss-shared) * pageSizeKB,
	}, nil
}

JSON omitempty vs omitzero ​

Go 1.24 新增 omitzero:

類型omitempty 省略omitzero 省略
int, string, bool, pointer零值零值
slice / mapnil 或 len == 0只有 nil
struct永遠不省略所有欄位為零值,或 IsZero() 回傳 true
  • 型別有 IsZero() bool 時,omitzero 用它判斷(例如 time.Time)
  • 兩個 tag 一起標時,符合任一條件就省略

原文:Go 1.24 omitzero

url.Parse 與數字開頭的 scheme ​

go
url.Parse("1mg://www.1mg.com/search")
// error: first path segment in URL cannot contain colon

不是 bug:RFC 3986 規定 scheme 是 ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ),不能以數字開頭。處理這類 deeplink 要自己先切 scheme。

原文:Parsing deeplinks by url.Parse may fail

Go 1.18+ http.Client 預設 TLS 1.2 ​

client 端預設最低版本從 TLS 1.0 改為 1.2。升級前確認對方 server 支援 TLS 1.2 以上:

bash
curl --tlsv1.2 --tls-max 1.2 https://example.com   # 只用 TLS 1.2
curl --tlsv1.3 https://example.com                 # TLS 1.3

Go 1.18 可用 GODEBUG=tls10default=1 暫時退回,1.19 起移除,只能在 tls.Config{MinVersion: ...} 設定。

原文:Go 1.18 有關 http.Client 的 TLS 變動

頁面歷史

Just observe 👀