1-6 字符串
在Go语言里面,字符串属于不可变数值类型,也就是是当变量的值发生改变时,其内存地址发生改变。在Go语言内部字符串是使用指针指向UTF-8数组。
当然,与不可变数值类型相反,可变数值类型的意思就是,当变量的值发生改变时,其内存地址不发生改变。
- 默认值是空字符串 “”。
- 用索引号访问某字节,如 s[i]。
- 不能用序号获取字节元素指针,&s[i] ⾮非法。
- 不可变类型,无法修改字节数组。
- 字节数组尾部不包含 NULL
- 使用 “`” 定义不做转义处理的原始字符串,支持跨行
s := ` a
b\r\n\x00
c`
println(s)
- 连接跨行字符串时,"+" 必须在上一行末尾,否则导致编译错误。
s := "Hello, " +
"World!"
s2 := "Hello, "
+ "World!" // Error: invalid operation: + untyped string
- 支持用两个索引号返回子串(也就是对字符串进行切片)。子串依然指向原字节数组,仅修改了指针和长度属性。
s := "Hello, World!"
s1 := s[:5] // Hello
s2 := s[7:] // World!
s3 := s[1:5] // ello
- 要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。
func func2() {
s := "abcdc"
bs := []byte(s)
bs[1] = 'C'
println(string(bs))
u := "电脑"
us := []rune(u)
us[1] = '话'
println(string(us))
}
- 对字符串进行遍历,可以使用for语句来进行
func func3() {
s := "abc汉字"
for i := 0; i < len(s); i++ { // byte
fmt.Printf("%c,", s[i])
}
fmt.Println()
for _, r := range s { // rune
fmt.Printf("%c,", r)
}
}
- 关于go语言的rune和byte字符
go语言有两种字符类型,一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符,另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。