字符串在所有语言中可以说是用的最频繁的一种数据结构, 在golang中当然也存在.虽然字符串往往被看做一个整体,但是实际上字符串是一片连续的内存空间,我们也可以将它理解成一个由字符组成的数组
golang中的字符串是个只读的, 它实际上是由字符组成的数组,会占用一片连续的内存空间, 这里的只读是说无法直接改变字符串, 在运行时我们其实还是可以将这段内存拷贝到堆或者栈上,将变量的类型转换成 []byte
之后就可以进行,修改后通过类型转换就可以变回 string
,Go 语言只是不支持直接修改 string
类型变量的内存空间
数据结构
1 | type StringHeader struct { |
字符串定义
1 | // 使用"", 如果字符串内部出现双引号,需要使用 \ 符号转义 |
常用操作
1 | // 访问 |
类型转换
1 | bString := "abc我是中国人" |
strings包的使用
strings包中包含非常多的实用函数, 这里挑几个比较常用的记录一下
1 | // 判断给定字符串s中是否包含子串substr, 找到返回true, 找不到返回false |
注意点
- 字符串是不可变值类型,内部⽤指针指向 UTF-8 字节数组。
- 默认值是空字符串 “”。
- ⽤索引号访问某字节,如 s[i], 取出的是字节,不是字符
- 由于字符串是只读的, 因此不能⽤序号获取字节元素指针, &s[i] ⾮法, 提示cannot take the address of xxx,原因在于如果支持取地址操作,则就可以使用指针对改地址指向的值进行修改, 这就违背了字符串只读的前提。
- 不可变类型,⽆法修改字节数组。使用[]rune进行修改是重新分配内存,并复制字节数组
- 字符串可以用==和<进行比较