- TL;DR:
slice := array[:]
で変換できる
Go言語にはリストの様なものが二つあります。配列(固定長)とスライス(可変長)です。 一般に、Go言語で配列を扱うことは多くないでしょう。 実際、多くのパッケージ(標準パッケージを含む)が要求するのはスライスです。
とは言っても一部のパッケージでは配列を取り扱っているものがあります。
例えば、crypto/sha512
を見てみる
と、以下の様な関数が存在します。
|
|
ここで、Size
は同パッケージ内で宣言されている定数で、値は64です。
つまり、この関数は64バイトの長さを持った配列を返します。
この関数は与えられたデータからSHA512チェックサムを計算するものです。 勿論、返ってきた値をそのまま使用することもあるとは思いますが、そのままの値は人間可読な値では無いため、hexdigestを得たいと思うでしょう。
Go言語にはもちろんのことながら、encoding/hex
パッケージが存在し、簡単に16進文字列を得ることができます。
16進表記の文字列を得るためには、次の関数を使用します。
|
|
引数に注目します。
要求されているのはbyte
のスライスです。
Goでは、配列とスライスは基本的に別物ですから、以下の様に書くことはできません。
|
|
そうは言っても、配列とスライスは非常に似ています。 次のように書きたくなりますね。
|
|
しかし、次のようなエラーを生じます。
cannot convert sha512.Sum512("foobar") (type [64]byte) to type []byte
型変換はできないようです。 どうしたら良いのでしょうか。
Go言語では、配列の範囲インデックスを使った場合、返される値はスライスとなります。
|
|
また、インデックスを省略することもできます。 開始値を省略すれば、0を与えたものと見なされますし、終了値を省略すれば、配列の最後までを切り取ります。
|
|
では、両方省略するとどうなるでしょうか。 両方省略すると、もとの配列と同じ内容のスライスが返されます。
つまり、配列をスライスに変換したい場合は、次のように書くことができます。
|
|
さきほどの例に戻ってみましょう。
sha512.Sum512()
は配列を返し、hex.EncodeToString()
はスライスを要求するのでした。
この場合、次のように書くことができます。
|
|
これで無事、配列とスライスの変換をして、SHA512チェックサムの16進表現を得ることができました。