Go字符串
字符串
字符串在Go语言中以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64等)一样。 提示:在C++、C#语言中,字符串以类的方式进行封装。 C#语言中在使用泛型匹配约束类型时,字符串是以Class的方式存在,而不是String,因为并没有“字符串”这种原生数据类型。 在C++语言中使用模板匹配类型时,为了使字符串与其他原生数据类型一样支持赋值操作,需要对字符串类进行操作符重载。 字符串的值为双引号中的内容,可以在Go语言的源码中直接添加非ASCII码字符,代码如下:
str := "hello world"
ch := "中文"
字符串转义符
Go语言的字符串常见转义符包含回车、换行、单双引号、制表符等
在Go语言源码中使用转义符代码如下:
package main
import (
"fmt"
)
func main() {
fmt.Println("str := \"c:\\Go\\bin\\go.exe\"")
}
代码输出如下:
str := "c:\Go\bin\go.exe"
这段代码中将双引号和反斜杠“\”进行转义。
字符串实现基于UTF-8编码
Go语言里的字符串的内部实现使用UTF-8编码。通过rune类型,可以方便地对每个UTF-8字符进行访问。当然,Go语言也支持按传统的ASCII码方式进行逐字符访问。
提示:Python语言的2.0版本不是基于UTF-8编码设计,到了3.0版才改为UTF-8编码设计。因此,使用2.0版本时,在编码上会出现很多混乱情况。
同样,C/C++语言的std::string在使用UTF-8时,经常因为没有方便的UTF-8配套封装让编写极为困难。
定义多行字符串
在源码中,将字符串的值以双引号书写的方式是字符串的常见表达方式,被称为字符串字面量(string literal)。这种双引号字面量不能跨行。如果需要在源码中嵌入一个多行字符串时,就必须使用“`”字符,代码如下:
const str = ` 第一行
第二行
第三行
\r\n
`
fmt.Println(str)
输出如下:
第一行
第二行
第三行
\r\n
“`”叫反引号,就是键盘上1键左边的键,两个反引号间的字符串将被原样赋值到str变量中。
在这种方式下,反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
多行字符串一般用于内嵌源码和内嵌数据等,代码如下:
const codeTemplate = `// Generated by github.com/davyxu/cellnet/
protoc-gen-msg
// DO NOT EDIT!
// Source:
package
import (
"github.com/davyxu/cellnet"
"reflect"
_ "github.com/davyxu/cellnet/codec/pb"
)
func init() {
//
cellnet.RegisterMessageMeta("pb","", reflect.TypeOf((*)(nil)).Elem(), )
}
`
这段代码只定义了一个常量codeTemplate,类型为字符串,使用“`”定义。字符串的内容为一段代码生成中使用到的Go源码格式。
在“`”间的所有代码均不会被编译器识别,而只是作为字符串的一部分。