Go言語でのStringとSliceの基本
Go言語では、string
とslice
は非常に重要なデータ型です。それぞれの基本的な特性と使い方を理解することは、効率的なGoプログラムを書くために必要不可欠です。
String
Go言語のstring
は、文字列を表現するためのデータ型です。string
はイミュータブル(変更不可能)であり、一度作成されるとその値を変更することはできません。
s := "Hello, World!"
fmt.Println(s) // 出力: Hello, World!
Slice
一方、slice
は配列の一部を表現するデータ型です。slice
はミュータブル(変更可能)であり、その要素を自由に変更することができます。
arr := []int{1, 2, 3, 4, 5}
s := arr[1:4]
fmt.Println(s) // 出力: [2 3 4]
これらの基本的な特性を理解することで、Go言語でのstring
とslice
の扱い方がより明確になるでしょう。次のセクションでは、これらのデータ型をどのように変換するかについて詳しく説明します。
StringをSliceに変換する方法
Go言語では、string
をslice
に変換する方法は非常に簡単です。具体的には、[]byte
や[]rune
を使用してstring
をslice
に変換します。
[]byteを使用する方法
string
を[]byte
に変換すると、各文字がASCIIコード(またはUTF-8エンコード)のバイト値に変換されます。
s := "Hello, World!"
b := []byte(s)
fmt.Println(b) // 出力: [72 101 108 108 111 44 32 87 111 114 108 100 33]
[]runeを使用する方法
一方、string
を[]rune
に変換すると、各文字がUnicodeコードポイントに変換されます。これは、マルチバイト文字(例えば、日本語やアラビア語など)を扱う際に特に有用です。
s := "こんにちは世界!"
r := []rune(s)
fmt.Println(r) // 出力: [12371 12435 12395 12385 12399 19990 30028 65281]
これらの方法を使って、Go言語でstring
をslice
に変換することができます。次のセクションでは、逆の変換、つまりslice
からstring
への変換について説明します。
SliceからStringへの変換
Go言語では、slice
からstring
への変換も非常に簡単です。具体的には、string()
関数を使用してslice
をstring
に変換します。
[]byteからStringへの変換
[]byte
からstring
への変換は、バイト値を元の文字に戻すプロセスです。
b := []byte{72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33}
s := string(b)
fmt.Println(s) // 出力: Hello, World!
[]runeからStringへの変換
同様に、[]rune
からstring
への変換は、Unicodeコードポイントを元の文字に戻すプロセスです。
r := []rune{12371, 12435, 12395, 12385, 12399, 19990, 30028, 65281}
s := string(r)
fmt.Println(s) // 出力: こんにちは世界!
これらの方法を使って、Go言語でslice
からstring
への変換を行うことができます。次のセクションでは、string
とslice
の違いについて詳しく説明します。
StringとSliceの違い
Go言語のstring
とslice
は、それぞれ異なる特性と用途を持つデータ型です。以下に、その主な違いを列挙します。
イミュータブル性 vs ミュータブル性
-
string
はイミュータブル(変更不可能)です。一度string
が作成されると、その値は変更できません。新しい値を代入することでstring
を”変更”すると、実際には新しいstring
が作成され、古いstring
はガベージコレクションの対象となります。 -
一方、
slice
はミュータブル(変更可能)です。slice
の要素は自由に変更でき、その変更はslice
が参照する元の配列にも反映されます。
文字列 vs 配列の一部
-
string
は文字列を表現するためのデータ型です。string
は文字の連続したシーケンスを表し、各文字はUTF-8エンコードされたバイトとして格納されます。 -
slice
は配列の一部を表現するためのデータ型です。slice
は配列の任意の部分を参照し、その部分を変更することができます。
これらの違いを理解することで、Go言語でstring
とslice
を適切に使い分けることができます。次のセクションでは、これらの知識を活用した実用的な例と応用について説明します。
実用的な例と応用
Go言語のstring
とslice
の知識を活用すると、さまざまな実用的な問題を解決することができます。以下に、その一例を示します。
文字列の反転
string
を[]rune
に変換することで、文字列を反転することができます。これは、slice
がミュータブルであるためです。
s := "こんにちは世界!"
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
s = string(r)
fmt.Println(s) // 出力: !界世はちにんこ
文字列の分割
strings
パッケージのSplit
関数を使用すると、string
を特定の区切り文字で分割して[]string
を作成することができます。
s := "apple,banana,cherry"
ss := strings.Split(s, ",")
fmt.Println(ss) // 出力: [apple banana cherry]
これらの例は、Go言語のstring
とslice
の基本的な使い方を示しています。これらの知識を活用すれば、より複雑な問題に対応することも可能です。具体的な応用例については、次のセクションで詳しく説明します。