いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-252 (文字列に対してのruneとbyteでの操作)

概要

Goを始めた人からよく聞かれる内容なので、ついでにここにメモメモ。。。

Goで文字列は string ですが、他の言語と同様にイミュータブル(不変)です。

文字列の内容を一部だけ変更したい場合でも、新しい文字列を作る必要があります。

いろいろなやり方がありますが、runeとbyteを使ってやることもできます。

byte はバイトを表します。

rune は文字を表します。

日本語などのマルチバイト文字が含まれている文字列を操作する場合、複数バイトで1文字が表現されていることに注意する必要があります。そんなときは rune を使うと便利です。

実際のサンプルを見るとすぐに分かると思います。

サンプル

package main

import (
    "fmt"
    "strconv"

    "github.com/devlights/gomy/errs"
)

func main() {
    var (
        s = "こんにちわ 世界"
        r = []rune(s)
        b = []byte(s)
    )

    r[1] = 'A'
    r[6] = 'B'
    fmt.Println(string(r))

    b[1] = byte(errs.Drop(strconv.Atoi("A")))
    b[6] = byte(errs.Drop(strconv.Atoi("B")))
    fmt.Println(string(b))
}

実行すると以下のようになります。

$ task run
task: [run] go mod tidy
task: [run] go run main.go
こAにちわ B界
��ん��ちわ 世界

rune の場合はちゃんと指定したインデックス位置の文字を処理しているのに対して、byteの方はバイト位置で処理しています。なので、ちゃんと文字が置換できていません。

参考情報

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。