LoginSignup
0
0

More than 1 year has passed since last update.

[]byte("a", "b", "c") でエラーがでる理由わかる?正しい書き方は?

Last updated at Posted at 2023-01-27

やりたいこと

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0