修改字符串

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。

  1. func changeString() {
  2. s1 := "hello"
  3. // 强制类型转换
  4. byteS1 := []byte(s1)
  5. byteS1[0] = 'H'
  6. fmt.Println(string(byteS1))
  7. s2 := "博客"
  8. runeS2 := []rune(s2)
  9. runeS2[0] = '狗'
  10. fmt.Println(string(runeS2))
  11. }
  1. 先将这段内存拷贝到堆或者栈上;
  2. 将变量的类型转换成 []byte 后并修改字节数据;
  3. 将修改后的字节数组转换回 string
  1. // string is the set of all strings of 8-bit bytes, conventionally but not
  2. // necessarily representing UTF-8-encoded text. A string may be empty, but
  3. // not nil. Values of string type are immutable.
  4. type string string

string是8位字节的集合,通常但不一定代表UTF-8编码的文本。string可以为空,但不能为nil。string的值是不能改变的

Go源代码为 UTF-8 编码格式的,源代码中的字符串直接量是 UTF-8 文本。所以Go语言中字符串是UTF-8编码格式的。

  1. // rune is an alias for int32 and is equivalent to int32 in all ways. It is
  2. // used, by convention, to distinguish character values from integer values.
  3. type rune = int32

rune是int32的别名,在所有方面都等同于int32,按照约定,它用于区分字符值和整数值。

rune一个值代表的就是一个Unicode字符,因为一个Go语言中字符串编码为UTF-8,使用1-4字节就可以表示一个字符,所以使用int32类型范围就可以完美适配。

见坑

字符串拼接

优先使用 strconv 而不是 fmt