Go release notes 追っかけ
Go 1.20
Ref
Cgo cgoを利用しないことがデフォルトになった。
CGO_ENABLED
はデフォルトでOff(0
)になり、CGO_ENABLED=0 go build ...
のように記載しなくてよくなった。
また、標準ライブラリで現状でcgoを使っているのは、net
, os/user
, plugin
パッケージの3つであるが、MacOSに関してはnet
, os/user
パッケージにてcgoを使わないように修正されたとのこと。
The packages in the standard library that use cgo are net, os/user, and plugin. On macOS, the net and os/user packages have been rewritten not to use cgo: the same code is now used for cgo and non-cgo builds as well as cross-compiled builds.
A consequence is that, on macOS, if Go code that uses the net package is built with -buildmode=c-archive, linking the resulting archive into a C program requires passing -lresolv when linking the C code.
→ WANT: 本当にそうなのか、cgoあるなしをLinuxとMacで比較して、記事にしたい。
Cover アプリケーションコード、Integration TestとしてCoverageのプロファイルができるようになった。
以下のように使うらしい。(go tool covdata
は1.20からの新しいサブコマンド)
# ↓coverageファイルの生成取得
$ go build -cover -o myprogram.exe myprogram.go
# ↓coverageファイルの分析
$ go tool covdata <mode> -i=<dir1,dir2,...> ...flags...
Wrapping multiple errors Error Wrapを複数エラー同時にできるようになった。
err1 := errors.New("err1")
err2 := errors.New("err2")
// 複数Error Wrapのやり方1: 複数の %w を用いる場合
err3 := fmt.Errorf("err: %w, %w", err1, err2)
// 複数Error Wrapのやり方2: errors.Join を用いる場合
err4 := errors.Join(err1, err2)
HTTP ResponseController 各HTTPハンドラごとにタイムアウト等を設定できるResponseControllerが登場
func RequestHandler(w ResponseWriter, r *Request) {
rc := http.NewResponseController(w)
rc.SetWriteDeadline(time.Time{}) // disable Server.WriteTimeout when sending a large response
io.Copy(w, bigData)
}
既存のResponseWriter
にSetWriteDeadline
メソッドを追加すると破壊的変更になるため、新しいResponseController
という構造体型を作成した、とのこと。(ref: https://github.com/golang/go/issues/54136)
Go 1.21
Ref
Changes to the language min, max ビルトイン関数の登場
最小値、最大値を出せる。( official: https://go.dev/ref/spec#Min_and_max )
Changes to the language clear ビルトイン関数の登場
mapとsliceの要素を削除する。( official: https://go.dev/ref/spec#Clear )
Changes to the language いくつかの型推論の向上
(理解できていない 2023年8月13日時点)
New log/slog package slog (Structured Log) の登場
課題: ログの構造化が公式サポートがなかった。
Compiler ランタイム時のProfile情報をコンパイル最適化に用いる技術である、Profile-guide optimization (PGO) がGo1.20ではプレビューであったのがGeneralになった。
Go 1.22
Standard library New math/rand/v2 package
Go 1.22 includes the first “v2” package in the standard library, math/rand/v2. The changes compared to math/rand are detailed in proposal #61716.
Go 1.23
Changes to the language イテレーターの登場
##range
のloopが以下のイテレーター関数を受け付けるようになった。
func(func() bool)
func(func(K) bool)
func(func(K, V) bool)
詳細はiterパッケージを参照。
イテレーターに関するモチベーションの議論はこちらのIssue参照
Go 1.23で導入されたiteratorは何を解決し、なぜ今の形になったのか
### iterator解説記事Standard library Timer changes
##time.Timer と time.Tickerの仕様が変わったようだがよく理解できていない(2024年8月26日時点)
Go 1.23 makes two significant changes to the implementation of time.Timer and time.Ticker.
First, Timers and Tickers that are no longer referred to by the program become eligible for garbage collection immediately, even if their Stop methods have not been called. Earlier versions of Go did not collect unstopped Timers until after they had fired and never collected unstopped Tickers.
Second, the timer channel associated with a Timer or Ticker is now unbuffered, with capacity 0. The main effect of this change is that Go now guarantees that for any call to a Reset or Stop method, no stale values prepared before that call will be sent or received after the call. Earlier versions of Go used channels with a one-element buffer, making it difficult to use Reset and Stop correctly. A visible effect of this change is that len and cap of timer channels now returns 0 instead of 1, which may affect programs that poll the length to decide whether a receive on the timer channel will succeed. Such code should use a non-blocking receive instead.
Standard library New unique package
##新しいunique package は ( “interning” または “hash-consing”のような) 値を正規化する機能を提供する。
The unique package provides facilities for canonicalizing ("interning") comparable values.
以下のように記載があるが比較可能な(comparable)の意味がわかっていない(2024年8月26日時点)
→ Heapメモリ内で圧縮するにあたってその判断のために型がcomparableである必要があるということ (2024年9月4日時点)
Any value of comparable type may be canonicalized with the new Make[T] function, which produces a reference to a canonical copy of the value in the form of a Handle[T]. Two Handle[T] are equal if and only if the values used to produce the handles are equal, allowing programs to deduplicate values and reduce their memory footprint. Comparing two Handle[T] values is efficient, reducing down to a simple pointer comparison.
→ 以下の解説スライドでの内容を画像で拝借
The Go Blog - New unique package ← 公式Blogでの解説
###Standard library New structs package
#### 標準パッケージ更新 わかりやすい解説スライド 2024/09/04
このスライドのおかげで概要が理解できた。ありがたい。