Golangにおける文字列(string)について

Golang

どのプログラミング言語でも、文字列は必要不可欠です。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"
}

このように、文字列の中で値を変更することができます。

タイトルとURLをコピーしました