コンテンツにスキップ

Go/string

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goのstringについて

[編集]

Goにおける string は、UTF-8エンコーディングされた不変(immutable)なバイト列です。文字列操作は多くの場面で使われ、可読性や安全性の高いデータ型です。string は文字(rune)列ではなく、バイト列のスライスのように扱われる点に注意が必要です。

基本情報

[編集]
  • Goの string はUTF-8でエンコードされたバイト列
  • イミュータブル(変更不可):一度作成した文字列は書き換え不可
  • 内部表現:長さ+バイト配列(sliceのような構造)
  • 空文字列は ""
  • Unicode(rune)と文字列の関係に注意(1文字 ≠ 1バイト)

他のキーワードとの組み合わせ

[編集]

変数宣言との組み合わせ

[編集]
var name string = "Gopher"
greeting := "Hello, 世界"
empty := "" // 空文字列

定数定義との組み合わせ

[編集]
const Hello string = "Hello"
const World = "World"       // 型推論
const Multiline = `複数行の
文字列リテラル`

関数パラメータと戻り値

[編集]
func Greet(name string) string {
    return "Hello, " + name + "!"
}

func IsEmpty(s string) bool {
    return s == ""
}

型変換

[編集]
bytes := []byte("Hello")
s := string(bytes) // []byte → string

runes := []rune("世界")
s2 := string(runes) // []rune → string

b := []byte("Go言語")
b[0] = 'J'          // これはstringにはできない(stringは不変)

s3 := string(65)    // → "A"(1 rune)

配列とスライス

[編集]
words := []string{"apple", "banana", "cherry"}

lines := strings.Split("a,b,c", ",") // ["a", "b", "c"]
joined := strings.Join([]string{"a", "b", "c"}, "-") // "a-b-c"

マップ

[編集]
dict := map[string]string{
    "en": "hello",
    "ja": "こんにちは",
}

count := map[string]int{
    "a": 3,
    "b": 2,
}

構造体のフィールド

[編集]
type User struct {
    Name     string
    Email    string
    Password string
}

type Log struct {
    Level   string
    Message string
}

バイト処理・UTF-8処理との組み合わせ

[編集]
import "unicode/utf8"

func CharCount(s string) int {
    return utf8.RuneCountInString(s)
}

func FirstRune(s string) rune {
    r, _ := utf8.DecodeRuneInString(s)
    return r
}

func BytesToString(b []byte) string {
    return string(b)
}

エスケープ・リテラル

[編集]
s1 := "Line1\nLine2"       // エスケープあり
s2 := `Line1
Line2`                    // 生(raw)文字列リテラル
s3 := "彼は\"Go\"を使う"    // ダブルクォートのエスケープ

一般的なユースケース

[編集]
  1. 文字列の切り出し(バイト単位に注意)
    s := "こんにちは"
    b := s[0:3]        // バイト単位 → 無効なUTF-8になる可能性あり
    
    r := []rune(s)
    sub := string(r[0:2]) // 文字単位の切り出し
    
  2. 文字列の検索や置換
    import "strings"
    
    func NormalizeSpace(s string) string {
        return strings.TrimSpace(strings.ReplaceAll(s, "\t", " "))
    }
    
    func HasPrefixHttp(url string) bool {
        return strings.HasPrefix(url, "http")
    }
    
  3. JSONとの連携(シリアライズ)
    import "encoding/json"
    
    type Message struct {
        Text string `json:"text"`
    }
    
    msg := Message{"こんにちは"}
    data, _ := json.Marshal(msg)
    

string 型は、Goにおいて最も頻繁に使われる基本型の1つです。UTF-8バイト列として実装されているため、Unicodeの扱いには注意が必要です。rune 型や []byte との相互変換を正しく理解し、イミュータブルな性質を意識して使用することで、安全で高効率な文字列処理が可能になります。