zhcn 编程语言 Golang 非公開: Go 语言字符串

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()获得,如len(str)。

可以使用标准索引方法检索字符串的内容(纯字节)。索引写在方括号[ ]中,从0开始计数。

  • 字符串 str 的第一个字节:str[0]
  • 第 i 个字节:str[i – 1]
  • 最后 1 个字节:str[len(str)-1]

请注意,此转换方案仅适用于纯 ASCII 字符串。

注意:获取字符串内某个字节的地址是非法的,例如&str[i]。

字符串连接符“+”

两个字符串 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 字符都可以通过 rune 类型轻松访问。当然,Go语言也支持按照传统的ASCII码进行逐字符访问。

下一章提供有关如何访问字符串中的 UTF-8 字符的详细信息。

定义多行字符串

使用双引号编写字符串是 Go 语言中表示字符串的常用方法。这称为字符串文字。这种类型的双引号文字不能跨越多行。如果您想将其嵌入到源代码中,请将其用于多行。字符串必须使用`反引号。这是代码:


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

代码运行结果:

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

`是键盘上键 1 左侧的键,两个反引号之间的字符串被分配给 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、文字列ライブラリ
https://www.youtube.com/watch?v=l-BgjOr5FJY
基本的な文字列操作 – Golang を学ぶ #12
https://www.youtube.com/watch?v=38NBS6sLXeA
字符串是不可变的字节序列。字符串可以包含任意数据,但通常用于包含人类可读的文本。字符串是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()获得,如len(str)。

可以使用标准索引方法检索字符串的内容(纯字节)。索引写在方括号[ ]中,从0开始计数。

  • 字符串 str 的第一个字节:str[0]
  • 第 i 个字节:str[i – 1]
  • 最后 1 个字节:str[len(str)-1]

请注意,此转换方案仅适用于纯 ASCII 字符串。

注意:获取字符串内某个字节的地址是非法的,例如&str[i]。

字符串连接符“+”

两个字符串 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 字符都可以通过 rune 类型轻松访问。当然,Go语言也支持按照传统的ASCII码进行逐字符访问。

下一章提供有关如何访问字符串中的 UTF-8 字符的详细信息。

定义多行字符串

使用双引号编写字符串是 Go 语言中表示字符串的常用方法。这称为字符串文字。这种类型的双引号文字不能跨越多行。如果您想将其嵌入到源代码中,请将其用于多行。字符串必须使用`反引号。这是代码:


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

代码运行结果:

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

`是键盘上键 1 左侧的键,两个反引号之间的字符串被分配给 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、文字列ライブラリ
https://www.youtube.com/watch?v=l-BgjOr5FJY
基本的な文字列操作 – Golang を学ぶ #12
https://www.youtube.com/watch?v=38NBS6sLXeA