やりたいこと
文字をバイト型のスライスに入れたいのですが、[]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'}