関連記事
Goメモ-177 (リリース前の機能も含めて最新のGoを試す)(gotip, gccない環境でインストール) - いろいろ備忘録日記
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。忘れないうちにメモメモ。。。
以下で知りました。
Approveされているので、入ることは確定みたいですね。
元々、実験的パッケージとして公開されていた golang.org/x/exp
の内容が取り込まれている感じ。
上記のパッケージについて、以前に記事にしていたので、以下良かったらご参照ください。
試してみる
gotipを使って試してみます。以下、Gitpod上で試しました。
まずはgotipをダウンロード。
$ lsb_relase -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy $ go install golang.org/dl/gotip@latest $ gotip download Cloning into '/home/gitpod/sdk/gotip'... remote: Finding sources: 100% (13479/13479) remote: Total 13479 (delta 1807), reused 8989 (delta 1807) Receiving objects: 100% (13479/13479), 27.29 MiB | 5.18 MiB/s, done. Resolving deltas: 100% (1807/1807), done. Updating files: 100% (12407/12407), done. Updating the go development tree... From https://go.googlesource.com/go * branch master -> FETCH_HEAD HEAD is now at e4e8f9b cmd/go: clear GOOS environment variable in TestScript/env_write Building Go cmd/dist using /home/gitpod/go. (go1.20.4 linux/amd64) Building Go toolchain1 using /home/gitpod/go. Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1. Building Go toolchain2 using go_bootstrap and Go toolchain1. Building Go toolchain3 using go_bootstrap and Go toolchain2. Building packages and commands for linux/amd64. --- Installed Go for linux/amd64 in /home/gitpod/sdk/gotip Installed commands in /home/gitpod/sdk/gotip/bin *** You need to add /home/gitpod/sdk/gotip/bin to your PATH. Success. You may now run 'gotip'! $ gotip version go version devel go1.21-e4e8f9b Tue May 23 04:38:43 2023 +0000 linux/amd64
オッケイ。てことで、slicesとmapsパッケージがあるかどうかを go doc で見てみます。
$ gotip doc slices package slices // import "slices" Package slices defines various functions useful with slices of any type. func Clip[S ~[]E, E any](s S) S func Clone[S ~[]E, E any](s S) S func Compact[S ~[]E, E comparable](s S) S func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S func Contains[E comparable](s []E, v E) bool func ContainsFunc[E any](s []E, f func(E) bool) bool func Delete[S ~[]E, E any](s S, i, j int) S func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S func Equal[E comparable](s1, s2 []E) bool func EqualFunc[E1, E2 any](s1 []E1, s2 []E2, eq func(E1, E2) bool) bool func Grow[S ~[]E, E any](s S, n int) S func Index[E comparable](s []E, v E) int func IndexFunc[E any](s []E, f func(E) bool) int func Insert[S ~[]E, E any](s S, i int, v ...E) S func Replace[S ~[]E, E any](s S, i, j int, v ...E) S func Reverse[E any](s []E) gitpod /workspace/playground (master) $ gotip doc maps package maps // import "maps" Package maps defines various functions useful with maps of any type. func Clone[M ~map[K]V, K comparable, V any](m M) M func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool func Keys[M ~map[K]V, K comparable, V any](m M) []K func Values[M ~map[K]V, K comparable, V any](m M) []V
ちゃんとありますね。
軽くだけ使ってみたサンプル
package main import ( "fmt" "maps" // Go 1.21 で追加 "slices" // Go 1.21 で追加 ) func main() { if err := run(); err != nil { panic(err) } } func run() error { // // Go 1.21 で slices パッケージが追加 // var ( s1 = []int{1, 2, 3, 4, 5} s2 []int ) s1 = slices.Insert(s1, 0, 0) fmt.Println(s1) s1 = slices.Delete(s1, 2, len(s1)-1) fmt.Println(s1) s2 = slices.Clone(s1) fmt.Println(s1, s2) fmt.Println(slices.Equal(s1, s2)) // // Go 1.21 で maps パッケージが追加 // var ( m1 = map[string]int{"one": 1, "two": 2, "three": 3} m2 map[string]int ) m2 = maps.Clone(m1) fmt.Println(m1, m2) fmt.Println(maps.Equal(m1, m2)) return nil }
まず、go 1.20 で試してみましょう。
$ go version go version go1.20.4 linux/amd64 $ go run main.go app/main.go:5:2: package maps is not in GOROOT (/home/gitpod/go/src/maps) app/main.go:6:2: package slices is not in GOROOT (/home/gitpod/go/src/slices)
当たり前ですが、コンパイルエラーになります。
てことで、gotip側でやってみましょう。
$ gotip run main.go [0 1 2 3 4 5] [0 1 5] [0 1 5] [0 1 5] true [0 0 0] [0 1 5] map[one:1 three:3 two:2] map[one:1 three:3 two:2] true
動きますね。
元々、そんなにスライスとマップの操作に関しては個人的に困ってなかったのですが、使いやすくなるのは良いことですね。
参考情報
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。