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 / map | nil 或 len == 0 | 只有 nil |
| struct | 永遠不省略 | 所有欄位為零值,或 IsZero() 回傳 true |
- 型別有
IsZero() bool時,omitzero用它判斷(例如time.Time) - 兩個 tag 一起標時,符合任一條件就省略
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.3Go 1.18 可用 GODEBUG=tls10default=1 暫時退回,1.19 起移除,只能在 tls.Config{MinVersion: ...} 設定。
原文:Go 1.18 有關 http.Client 的 TLS 變動