Go 言語文字列

 
 
文字列は不変のバイトのシーケンスです。文字列には任意のデータを含めることができますが、通常は人間が読めるテキストを含めるために使用されます。文字列は UTF-8 文字のシーケンスです (文字が ASCII コード テーブルの文字の場合、1 バイトを占めます)。その他の文字は必要に応じて 2 ~ 4 バイトを占めます)。

 

UTF-8 は広く使用されているエンコード形式であり、XML や JSON などのテキスト ファイルの標準エンコードです。占有バイト長に関するエンコードの不確定性により、Go 言語の文字列は必要に応じて 1 ~ 4 バイトを占有することもあります。これは、 C++ 、 Java 、 Pythonなどの他のプログラミング言語とは異なります (Java は常に 2 バイトを使用します) )。 Go 言語はメモリとハードディスクの使用量を削減するだけでなく、他の言語のように UTF-8 文字セットを使用してテキストをエンコードおよびデコードする必要もありません。

文字列は値型であり、値は不変です。つまり、テキストの内容は作成後に再度変更することはできません。さらに詳しく説明すると、文字列は固定長のバイト配列です。

文字列を定義する

二重引用符""は文字列の定義に使用でき、エスケープ文字は文字列内で改行、インデント、その他の効果を実現するために使用できます。一般的に使用されるエスケープ文字は次のとおりです。

  • \n: 改行文字
  • \r: キャリッジリターン
  • \t: タブキー
  • \u または \U: Unicode 文字
  • \\: バックスラッシュ自体
package main

import (
    "fmt"
)

func main() {
    var str = "IT基礎\nGoチュートリアル"
    fmt.Println(str)
} 

操作の結果は次のようになります。

IT基礎
Go チュートリアル

一般的な比較演算子 (==、!=、<、<=、>=、>) は、メモリ内のバイトを比較することによって文字列比較を実装するため、比較の結果は文字列が自然にエンコードされた順序になります。文字列が占めるバイト長は、len(str) などの関数 len() で取得できます。

文字列の内容 (純粋なバイト) は、標準のインデックス方法で取得できます。インデックスは角括弧[ ]内に記述され、インデックスは 0 からカウントされます。

  • 文字列 str の最初のバイト: str[0]
  • i 番目のバイト: str[i – 1]
  • 最後の 1 バイト: str[len(str)-1]

この変換スキームは純粋な ASCII 文字列に対してのみ有効であることに注意してください。

注: &str[i] など、文字列内のバイトのアドレスを取得することは不正です。

文字列連結文字「+」

2 つの文字列 s1 と s2 は、s := s1 + s2 によって結合できます。 s2 を s1 の末尾に追加し、新しい文字列 s を生成します。

複数行のコード内の文字列は、次の方法で連結できます。

 str := "文字列の先頭" +
"文字列の2番目の部分" 

ヒント: コンパイラは行末のセミコロンを自動的に補完するため、文字列の連結に使用するプラス記号「+」を最初の行の末尾に配置する必要があります。

「+=」を使用して文字列を連結することもできます。

s := "hel" + "lo, "
s += "world!"
fmt.Println(s) // 出力 “hello, world!” 

文字列の実装は UTF-8 エンコーディングに基づいています

Go 言語の文字列の内部実装では UTF-8 エンコーディングが使用されており、各 UTF-8 文字にはルーン タイプを介して簡単にアクセスできます。もちろん、Go 言語は従来の ASCII コードに従った文字ごとのアクセスもサポートしています。

文字列の UTF-8 文字にアクセスする詳細な方法については、次の章で詳しく紹介します。

複数行の文字列を定義する

Go 言語では、二重引用符を使用して文字列を記述することは、一般的な文字列表現の 1 つです。これを文字列リテラルと呼びます。この種の二重引用符リテラルは複数行にまたがることはできません。ソース コードに埋め込みたい場合は、複数行の場合に使用します。文字列には`バッククォートを使用する必要があります。コードは次のとおりです。


const str = `第一行
第二行
第三行
\r\n
`
fmt.Println(str) 

コードを実行した結果:

第一行
第二行
第三行
\r\n

バッククォート`はキーボードのキー 1 の左側のキーで、2 つのバッククォートの間の文字列がそのまま str 変数に代入されます。

この方法では、バックティック間の改行は文字列内の改行として扱われますが、エスケープ文字は無視され、テキストはそのまま出力されます。

複数行の文字列は、埋め込みソース コードや埋め込みデータなどに一般的に使用されます。コードは次のとおりです。

const codeTemplate = // github.com/skynet/cell/


package {{.PackageName}}

{{if gt .TotalMessages 0}}
import (
    "github.com/davyxu/cellnet"
    "reflect"
    _ "github.com/davyxu/cellnet/codec/pb"
)
{{end}}

func init() {
    {{range .Protos}}
    // {{.Name}}{{range .Messages}}
    cellnet.RegisterMessageMeta("pb","{{.FullName}}", reflect.TypeOf((*{{.Name}})(nil)).Elem(), {{.MsgID}})    {{end}}
    {{end}}
}` 

このコードは定数 codeTemplate のみを定義します。その型は`を使用して定義された文字列であり、文字列の内容はコード生成の一部で使用される Go ソース コード形式です。

`の間のすべてのコードはコンパイラによって認識されず、文字列の一部としてのみ認識されます。

 

「Go 言語文字列」についてわかりやすく解説!絶対に観るべきベスト2動画

Golang 文字列、Golang StringBuilder、文字列ライブラリ
基本的な文字列操作 – Golang を学ぶ #12