やりたいこと
文字をバイト型のスライスに入れたいのですが、[]byte("a", "b", "c")
はエラーがでます。
too many arguments in conversion to []byte
ふむふむ。引数が多いのか。。
エラーにある通り引数を一つにすればエラー回避できるのですが、どういう仕組みなのかを見ていきましょう。
[]byte(変数)
← 丸いかっこ と []byte{変数}
← 波状のかっこ の違い
丸いかっこを使う「型(変数)」は、型変換をする
丸いかっこを使う「型(値)」は、型変換を行う表現です。
(記事にしているのでよかったら見てください。😊 )
なので、[]byte(変数)
は、() 内の変数を、バイト型のスライスに変換する表現になります。
なので、複数の値を渡すのではなく []byte("abc")
とすれば、エラーはなくなります。
→ string 型 "abc" を byte 型のスライス に 型変換 していることになります。
ここで疑問が。。
波状のかっこもあるけど、違いはなに?です。
すぐには答えが思いつかなかったので調べてみました。
波状のかっこは、その型自身に変数を定義する
[]byte{変数}
は、単純に byte 型 のスライスに、"変数" を定義します。
なので、[]byte{'a', 'b', 'c'}
すれば、やりたいことを実現できます。
ここで別の疑問が。。
文字を渡しているのになぜ byte 型 として扱えているのか?です。
これもすぐに答えが思いつかなかったので調べてみました。
シングルクォート('
)、ダブルクォート ("
)、バッククォート(`
) の違い
- シングルクォート(
'
): デフォルト動作は、1文字を rune (= int32) 型 で扱う。ただし、byte (=uint8) 型を明示された場合は byte 型となる。 - ダブルクォート (
"
): 文字列を string 型 で扱う + エスケープシーケンスを特殊文字として扱う (例:\n
を改行として 扱う )。 - バッククォート(
`
): 文字列を string 型 で扱う + エスケープシーケンスを文字列として扱う (例:\n
を改行として 扱わない )。
なので、[]byte{'a', 'b', 'c'}
は、byte 型に変換された 'a'
をスライスに入れていることになります。
結論
下記のいずれかが、エラーを出さずにやりたいことを実現する表現となります。
[]byte("abc")
[]byte{'a', 'b', 'c'}