借鉴
https://talkgo.org/discuss/2018-05-22-go-string-to-byte-slice/
代码
import "fmt"
func TestString() {
s:="123"
ps:=&s
b:=[]byte(s)
pb:=&b
s+="4"
*ps+="5"
(*pb)[1] = 0
(*pb)[2] = 4
fmt.Printf("%+v\n",*ps)
fmt.Printf("%+v\n",*pb)
/*
输出:
12345
[49 0 4]
*/
}
解读
- string 是不可变的,不管是从 string 转到 []byte 还是从 []byte 转换到 string 都会发生一次复制
- 因此 s 和 b 可以看作两个内容相同的两个对象,对 s,b各自的修改不会影响对方
- 先看 ps,经过两次拼接后就是 “12345”
- 再看 pb,因为 s 中的内容都是 ASCII 字符,在 b 中只需要用一个 byte 就可以表示一个字符,所以 b 的实际内容是[49,50,51],分别对应1,2,3的 ASCII 编码。经过就修改后就变成了[49,0,4]