go字符串是不可改变的,不能用s[i]的方式直接进行字符串的修改。

所谓的字符串修改其实不是对字符串本身修改,而是复制字符串,同时修改值,即重新分配内存。

可以将字符串转化为[]byte或者[]rune进行修改后,重新转化为string型赋值给源字符串。

由于:
tyte(uint8的别名)等于uint8,rune(int32的别名)等于int32
所以:
字符串可以转化为:[]byte、[]uint8、[]rune、[]int32

golang中的byte与rune相似,它们都可以用来表示字符类型,区别在于:
1、byte等同于uint8,常用来处理ascii字符,其代表了 ASCII 码的一个字符。
2、rune等同于int32,常用来处理Unicode或者utf-8字符,其代表一个 UTF-8 字符

go语言中的字符串底层是通过byte数组实现的,中文字符在Unicode下占两个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。
所以直接len()求字符串长度,实际是在按照字节长度计算,所以一个汉子占三个字节,就算了3个长度:
len(“hello 你好")=12

可以通过以下两种方式获取字符串的字符串长度:
1、golang中的unicode/utf8包提供了用utf-8获取字符串长度的方法:
utf8.RuneCountInString(“hello 你好”)=8
2、通过rune类型处理unicodo字符:
len([]rune(“hello 你好”))=8

UTF-8 和 Unicode 有何区别?
Unicode 与 ASCII 类似,都是一种字符集。

字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。

UTF-8 是编码规则,将 Unicode 中字符的 ID 以某种方式进行编码,UTF-8 的是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:
0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
从 128 到 0x10ffff 表示其他字符。

根据这个规则,拉丁文语系的字符编码一般情况下每个字符占用一个字节,而中文每个字符占用 3 个字节。

广义的 Unicode 指的是一个标准,它定义了字符集及编码规则,即 Unicode 字符集和 UTF-8、UTF-16 编码等