系列文章
【golang学习之旅】报错:a declared but not used
【golang学习之旅】Go 的基本数据类型
目录
- 系列文章
- 使用示例
- string的底层数据结构
- 关于字符串复制
- 字符串是不可变的
- 如何高效的进行字符串拼接?
使用示例
Go 语言中的字符串只是一个只读的字节数组。
Go中的字符串都是采用UTF-8字符集编码。
字符串是用一对双引号(“”)或反引号( )括起来定义,它的类型是string
。
示例:
var frenchHello string // 声明变量为字符串的一般方法
var emptyString string = "" // 声明了一个字符串变量,初始化为空字符串
func test() {
no, yes, maybe := "no", "yes", "maybe" // 简短声明,同时声明多个变量
japaneseHello := "Konichiwa" // 同上
frenchHello = "Bonjour" // 常规赋值
}
string的底层数据结构
Go语言字符串的底层数据结构是 reflect.StringHeader
( reflect/value.go),它包含了指向字节数组的指针,以及该指针指向的字符数组的大小:
type StringHeader struct {
Data uintptr
Len int
}
下图展示了 “hello” 字符串在内存中的存储方式:
关于字符串复制
当将一个字符串变量赋值给另外一个变量时候,他们 StringHeader.Data 都指向同一个内存地址,不会发生字符串拷贝:
a := "hello"
b := a
字符串是不可变的
例如下面的代码编译时会报错:cannot assign to s[0]
var s string = "hello"
s[0] = 'c'
但如果真的想要修改怎么办呢?下面的代码可以实现:
s := "hello"
c := []byte(s) // 将字符串 s 转换为 []byte 类型
c[0] = 'c'
s2 := string(c) // 再转换回 string 类型
fmt.Printf("%s\n", s2)
或者下面的代码:
s := "hello"
s = "c" + s[1:] // 字符串虽不能更改,但可进行切片操作
fmt.Printf("%s\n", s)
如何高效的进行字符串拼接?
参考:https://go.cyub.vip/type/string/