いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-319 (Go 1.21 で slices, maps パッケージが追加される)

関連記事

Goメモ-177 (リリース前の機能も含めて最新のGoを試す)(gotip, gccない環境でインストール) - いろいろ備忘録日記

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

以下で知りました。

www.reddit.com

www.reddit.com

Approveされているので、入ることは確定みたいですね。

元々、実験的パッケージとして公開されていた golang.org/x/exp の内容が取り込まれている感じ。

上記のパッケージについて、以前に記事にしていたので、以下良かったらご参照ください。

devlights.hatenablog.com

devlights.hatenablog.com

試してみる

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のおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。