Go 语言中的字符串类型

Go 原生支持字符串类型,关键字string用于表示字符串数据类型。 1. 底层实现 Go 中的string实际上是一个struct类型,其本身并不真正存储字符串数据,仅是由一个指向底层数组的指针和字符串的长度字段组成,可以在标准库的reflect包中,找到下面代码: // $GOROOT/src/reflect/value.go // StringHeader是一个string的运行时表示 type StringHeader struct { Data uintptr Len int } 由于string类型实际上只是一个对底层存储的引用,因此实际传参的开销非常小,另外在生成string变量时,会同时存储字节长度len,所以无论字符串长度怎么变化,获取长度的时间都是O(1)。 底层实现图解: 三个必须记住的特性: 特性 含义 不可变 任何“修改”操作都会产生新字符串,原串不变 UTF-8 编码 源码中的字符串字面量默认是 UTF-8 零值是 "" 不是 nil,var s string 是空串 var s string = "Hello" // s[0] = 'h' // 编译错误:cannot assign to s[0] b := []byte(s) // 想修改就转成切片(会复制一份) 注意:len(s)返回的是字节数,不是字符数。中文、emoji 等多字节字符会让两者不相等。 2. 字面量与引号 Go 中初始化字符串变量,需要在双引号"中定义值,单引号'用于单个字符( 以及 runes )。 var Name string = "zhangsan" age := "18" var a char = 'a' s1 := "hello\nworld" // 双引号:支持 \n \t \" \\ 等转义 // 输出: // hello // world s2 := `hello\nworld` // 反引号(原生字符串):原样保留 // 输出: // hello\nworld s3 := "" // 空串,len == 0 Go 中没有也不支持三引号的写法,使用反引号来表示原生字面量。由于所见即所得,原样保留,可跨行的特点,常用于SQL/JSON/正则表达式中 ...