Go 1.21 リリース

  • #開発
  • #Golang
  • #1.21

こんにちは。CURUCURU エンジニアの兄山です。 今回は Golang1.21 に関してまとめていきたいと思います。

Golang1.21 がリリースされたということで早速触ってみました


slog

従来の log はテキストメッセージしか表示されないので、ログ調査したい場合に多少不便でした。なのでアプリケーションで使用する際は zap 等のライブラリを入れる必要がありました。

しかし標準のパッケージでslogが導入されたことにより上記不便を解消してくれました。 また JSON 形式で出力したりできるので、複雑なログでもまとめて確認できます。

package main

import (
	"log"
)

func main() {
	log.Print("This is log!!")
}


結果
2009/11/10 23:00:00 This is log!!
package main

import (
	"log/slog"
	"os"
)

func main() {
	logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

	logger.Info(
		"This is log!",
		"id", 1,
		"metod", "GET",
		"path", "/curucuru/get",
		"status", 200,
	)
}


結果
{"time":"2009-11-10T23:00:00Z","level":"INFO","msg":"This is log!","id":1,"metod":"GET","path":"/curucuru/get","status":200}

slices

個人的には欲しいなと思っていた機能でしたので嬉しかったです。

簡単にいうとスライスをいい感じに処理してくれるパッケージです。

これまでは、スライスの処理はforrangeで処理を行うので for 文が散乱していました。(表現の自由度が低いのは Go のいいところなのですが、簡単な Map 処理等は欲しいと思っていた)

例えば配列から重複を削除したい場合、これまでは以下のように実装していましたが Golang1.21 ではslices.Compact(arr)とすれば一発で処理できます。

package main

import "fmt"

func main() {
	arr := []string{"a", "b", "c", "c", "c"}
	set := make([]string, 0, len(arr))
	match := map[string]bool{}
	for i := 0; i < len(arr); i++ {
		if !match[arr[i]] {
			match[arr[i]] = true
			set = append(set, arr[i])
		}
	}
	fmt.Print(set)


  結果
  [a b c]
}
package main

import (
	"fmt"
	"slices"
)

func main() {
	arr := []string{"a", "b", "c", "c", "c"}
  set := slices.Compact(arr)
	fmt.Println(set)


  結果
  [a b c]
}

またスライスの最大値を抽出するslices.Max(arr)や、スライスの要素が等しいか判定するslices.Equal(arr)等、他にも便利そうなメソッドがあります。

まだまだ便利そうなパッケージがありそうなので今後も注視していきたいと思います。