Go言語でbyteとstringを変換する方法

Go言語でbyteとstringを変換する方法

Go言語では、byteとstringは密接に関連しているデータ型です。
byteは基本的にuint8の別名であり、文字列を構成する個々のバイトを表現します。
一方、stringはバイトのシーケンスを表現し、文字列として扱われます。
Goでbyteとstringを相互に変換する方法は非常にシンプルで、標準ライブラリによってサポートされています。

stringから[]byteへの変換

stringをbyteに変換する場合、byte()型変換を使用します。
この型変換は文字列をそのバイトのスライスに変換します。
例えば、次のようなコードでstringを[]byteに変換できます:

package main

import (
  "fmt"
)

func main() {
  s := "Hello, World!"
  b := []byte(s)  // stringを[]byteに変換
  fmt.Println(b)  // バイトスライスとして出力
}

このコードでは、sという文字列が[]byte型に変換されており、その結果がバイトのスライスとして出力されます。
出力は[72 101 108 108 111 44 32 87 111 114 108 100 33]のようになります。
これらの数値は文字列「Hello, World!」のASCIIコードを表しています。

[]byteからstringへの変換

逆に、byteをstringに変換する場合も簡単です。
string()型変換を使用します。
この型変換はバイトのスライスを文字列に変換します。
次のコードで
byteをstringに変換できます:

package main

import (
  "fmt"
)

func main() {
  b := []byte{72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33}
  s := string(b)  // []byteをstringに変換
  fmt.Println(s)  // 文字列として出力
}

このコードでは、bというバイトスライスがstring型に変換され、その結果が文字列として出力されます。
出力は"Hello, World!"となります。

注意点

Go言語では、stringはイミュータブル(変更不可能)なデータ型であるため、stringの個々の文字を直接変更することはできません。
stringをbyteに変換すると、新しいバイトスライスが作成され、そのスライスに対して操作を行うことができます。
例えば、次のようにstringの一部を変更したい場合は、
byteに変換してから操作する必要があります:

package main

import (
  "fmt"
)

func main() {
  s := "hello"
  b := []byte(s)  // stringを[]byteに変換
  b[0] = 'H'      // 最初の文字を変更
  s2 := string(b) // []byteを再度stringに変換
  fmt.Println(s2) // "Hello"と出力
}

このコードでは、元の文字列sの最初の文字を小文字のhから大文字のHに変更するために、一旦バイトスライスbに変換し、b[0]を変更した後、再びstringに変換しています。

Unicodeとマルチバイト文字の注意

GoのstringはUTF-8エンコーディングを使用しているため、マルチバイト文字(例えば日本語や中国語の文字)は複数のバイトで表現されます。
stringをbyteに変換すると、各文字がUTF-8エンコーディングに従ったバイト列に変換されます。
特にマルチバイト文字を処理する際には、UTF-8のバイト数に注意が必要です。
次の例では、マルチバイト文字を含む文字列を
byteに変換した場合の動作を示します:

package main

import (
  "fmt"
)

func main() {
  s := "こんにちは"
  b := []byte(s)
  fmt.Println(b) // UTF-8エンコードされたバイトスライスが表示されます
}

このコードは、各文字がUTF-8でエンコードされたバイト列を表示します。
出力は[227 129 147 227 130 147 227 129 171 227 130 147 227 129 161]のようになります。

bytesパッケージの利用

[]byteを操作する際には、Goの標準ライブラリであるbytesパッケージを利用することが便利です。
bytesパッケージには、バイトスライスに対するさまざまな関数が用意されており、文字列の操作と同様の操作ができます。

例えば、bytes.Contains関数を使用して、バイトスライスに特定のサブスライスが含まれているかを確認することができます:

package main

import (
  "bytes"
  "fmt"
)

func main() {
  b := []byte("Hello, World!")
  fmt.Println(bytes.Contains(b, []byte("World"))) // trueと出力
}

このように、bytesパッケージを使用することで、[]byteに対する操作が簡単になります。

まとめ

Go言語でbyteとstringを相互に変換する方法は非常に簡単です。
[]byteとstringの型変換を使うことで、バイトレベルでの操作と文字列レベルでの操作をスムーズに行えます。
ただし、stringがイミュータブルである点や、マルチバイト文字を扱う際のUTF-8エンコーディングの注意点を理解しておくことが重要です。
また、bytesパッケージを使用することで、バイトスライスの操作をより効率的に行うことができます。