いろいろ備忘録日記

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

Goメモ-277 (スライスから配列へ変換する)(Go 1.17以降のやり方)

概要

以下、自分用のメモです。よく忘れるので、ここにメモメモ。。。

以下のGo 1.20についての情報について書いてくださっている記事を見てて

zenn.dev

1.20 でついに

a := []string{"golang", "python", "csharp"}
b := [3]string(a)

ってかけるようになるんだーって知りました。記載的にポインタ経由した書き方しなくてよくなるので直感的になりますね。

んで、ついでなので現状(Go 1.17)のやり方について以下にメモしておこうと思いました。

サンプル

package slices

import (
    "github.com/devlights/gomy/output"
)

// ConvertToArrayGo117 は、Go 1.17 以降で有効な スライス から 配列 への変換方法についてのサンプルです。
//
// # REFERENCES
//   - https://tip.golang.org/ref/spec#Conversions_from_slice_to_array_pointer
//   - https://www.jetbrains.com/go/guide/tips/go-1-17-convert-slice-to-array-pointer/
//   - https://zenn.dev/koya_iwamura/articles/bb9b590b57d825
func ConvertToArrayGo117() error {
    //
    // Go 1.17 から以下のやり方でスライスから配列へ変換できるようになった
    // 当然であるが、ポインタで扱うか否かで挙動が変わるので注意
    //

    var (
        original            = []string{"golang", "python", "csharp", "java", "dart", "rust", "javascript"}
        array1   [5]string  = *(*[5]string)(original[:5])
        array2   *[2]string = (*[2]string)(original[5:])
    )
    output.Stdoutf("[array1  ]", "%v\n", array1)
    output.Stdoutf("[array2  ]", "%v\n", array2)
    output.Stdoutf("[original]", "%v\n", original)
    output.StdoutHr()

    array1[0] = "*****"
    array2[0] = "*****"

    output.Stdoutf("[array1  ]", "%v\n", array1)
    output.Stdoutf("[array2  ]", "%v\n", array2)
    output.Stdoutf("[original]", "%v\n", original)

    // 以下は、コンパイルは通るが実行時エラーとなる。
    //     panic: runtime error: cannot convert slice with length 7 to pointer to array with length 100
    //
    // var (
    //     array3 = *(*[100]string)(original)
    // )
    // output.Stdoutf("[array3  ]", "%v\n", array3)

    // 以下は、コンパイルは通るが実行時エラーとなる。
    //     panic: runtime error: cannot convert slice with length 7 to pointer to array with length 100
    // var (
    //     array4 = (*[100]string)(original)
    // )
    // output.Stdoutf("[array4  ]", "%v\n", array4)

    return nil
}

実行すると以下のようになります。

$ task run
task: [run] go run . -onetime

ENTER EXAMPLE NAME: slice_convert_to_array_go117

[Name] "slice_convert_to_array_go117"
[array1  ]           [golang python csharp java dart]
[array2  ]           &[rust javascript]
[original]           [golang python csharp java dart rust javascript]
-------------------------------------------------- 
[array1  ]           [***** python csharp java dart]
[array2  ]           &[***** javascript]
[original]           [golang python csharp java dart ***** javascript]


[Elapsed] 53.98µs

参考情報

www.jetbrains.com

Go言語による並行処理

Go言語による並行処理

Amazon


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

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