どのプログラミング言語でも、文字列は必要不可欠です。Goでもそれは変わりません。
本記事ではGolangにおいて文字列をどのように初期化し、使用するかを見ていきます。
Golangで文字列を初期化する
他のデータ型と同じように文字列を初期化することができます。また、文字列の連結も簡単にできます。
package main
import (
"fmt"
)
func main() {
var hello string = "Hello, " // string型の初期化
name := "Dan"
exclamation := "!"
var result = hello + name + exclamation //文字列の連結
fmt.Println(result) // "Hello, Dan!"
}
indexによるアクセス
Goの文字列は、配列やスライスのようにindex番号を用いることでアクセスすることができます。
以下がそのコード例です。
package main
import (
"fmt"
)
func main() {
greet := "Hello World"
fmt.Printf("%c\n", greet[0]) // H
fmt.Printf("%x\n", greet[0]) // 48
}
文字列の長さを取得する
文字列の長さを得るには、len( )関数を使用します。
package main
import (
"fmt"
)
func main() {
fmt.Println(len("Hello, world")) // 12
}
Goで文字列を比較する
文字列の比較も可能です。文字列を比較したら、0、1、-1のいずれかの値を返します。
package main
import (
"fmt"
)
func main() {
var hello string = "Hi"
var hello2 string = "Hello"
fmt.Println(hello == hello2) // false
fmt.Println(hello > hello2) // true
fmt.Println(hello < hello2) // false
}
Goのルーン文字
ルーンはint32型であり、ユニコードコードポイントを表します。
つまり、各コードポイントに対して、状況に応じて任意の値をルーンに取らせることができるのです。
では、ルーンの使い方を見てみましょう。
package main
import (
"fmt"
)
func main() {
s := "This is an example."
runes := []rune(s)
fmt.Println(len(runes)) // 26
fmt.Printf("%c", runes[0]) // T
for i := 0; i<len(s); i++ {
// "%U" prints Unicode equivalent
fmt.Printf("%U ", s[i]) // "TU+0054 U+0068 U+0069 U+0073 U+0020 U+0069 U+0073 U+0020 U+0061 U+006E U+0020 U+0065 U+0078 U+0061 U+006D U+0070 U+006C U+0065 U+002E "
}
}
文字列の反復処理
文字列を繰り返し処理するには、ループを使用します。
では、どのような方法があるか見てみましょう。
forループを使用する
ここでは、シンプルなforループを使って、文字列を反復処理する例を示します。
package main
import (
"fmt"
)
func main() {
s := "example string"
for i := 0; i < len(s); i++ {
fmt.Printf("%c ", s[i]) // "e x a m p l e s t r i n g "
}
}
範囲を指定したforループを使用する
rangeはスライスまたは配列に対して反復処理を行います。
文字列の場合、範囲はその各バイトを反復します。
package main
import (
"fmt"
)
func main() {
s := "example string"
for i, c := range s {
fmt.Printf("%c->%d ", c, i) // prints "e->0 x->1 a->2 m->3 p->4 l->5 e->6 ->7 s->8 t->9 r->10 i->11 n->12 g->13 "
}
}
文字列を構成する
文字列は直接初期化する以外にも、様々な方法で構築することができます。
ここでは、byteのスライスとルーン文字から文字列を構成する方法を紹介します。
byteのスライスから構築する
文字列は、byteのスライスから構築することができます。
本質的に文字列はbyteのスライスに過ぎないのでここでは、スライスを文字列に変換する方法について説明します。
package main
import (
"fmt"
)
func main() {
stringBytes := []byte{72, 101, 108, 108, 111}
stringCreated := string(stringBytes)
fmt.Println(stringCreated) // "Hello"
}
ルーンのスライスから構築する
package main
import (
"fmt"
)
func main() {
runesOfString := []rune{0x0048, 0x0065, 0x006C, 0x006C, 0x006F}
s := string(runesOfString)
fmt.Println(s) // "Hello"
}
文字列の不変性
文字列は本質的に不変です。文字列が代入された後に値を代入することはできません。
以下はそれを説明するコード例です。
package main
import (
"fmt"
)
func main() {
runesOfString := []rune{0x0048, 0x0065, 0x006C, 0x006C, 0x006F}
s := string(runesOfString)
fmt.Println(s) // "Hello"
}
文字列を変異させるには、まずルーンの配列に変換する必要があります。
package main
import (
"fmt"
)
func main() {
s := "A string"
// s[0] = "B" // throws error "cannot assign to s[0]"
// convert to rune slice
runes := []rune(s)
//mutate value
runes[0] = 'B'
s = string(runes) // convert to string again
fmt.Println(s) // "B string"
}
このように、文字列の中で値を変更することができます。