- Go语言的string和C++的string有比较大的区别。go中的string是一个字符串常量,不能直接修改其中的元素,而c++中string可以直接修改其内部元素的值。
C++
std::string s = "123";
s[0] = 2;
std::cout << s << "\n";
//输出结果 223
GO
s := "123";
s[0] = '2';
//则会直接报错
Go中string []byte的底层结构
# string
type StringHeader struct {
Data uintptr
Len int
}
# []byte
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
- 当我们累加string的时候,go会创建一块新的空间,然后将累加的值拷贝过去。这样就导致每一次对string进行+操作时都会生成新的空间然后复制造成性能低下。
为什么go中string的操作每次要申请新的空间? - 因为字符串作为只读的类型,我们并不会直接向字符串直接追加元素改变其本身的内存空间,所有在字符串上的写入操作都是通过拷贝实现的。
解决:
- 我们可以用byte来进行操作,然后将结果转换成string就可以。因为每次都byte进行写入到时候,会申请两倍的空间来进行操作。
string 和 []byte 的一些坑点总结:
s := "你好"
for _, i := range s {
fmt.Println(i)
}
b := []byte(s)
for _, i := range b {
fmt.Println(i)
}
- 输出结果会发现打印的完全不通。
原因:
在range string时,i为rune类型,utf8编码类型。而range []byte类型时则为byte类型,导致打印结果不同。