该实现是:
// String returns the accumulated string.
func (b *Builder) String() string {
return *(*string)(unsafe.Pointer(&b.buf))
}
根据我的测试,将 []byte 转换为字符串采用了“写时复制”技术,如果其中一个正在更改内部切片,则编译器会生成深拷贝指令:
{
a := []byte{'a'}
s1 := string(a)
a[0] = 'b'
fmt.Println(s1) // a
}
{
a := "a"
b := []byte(a)
b[0] = 'b'
fmt.Println(a) // a
}
如果按照以下方式实现会发生什么情况?
// String returns the accumulated string.
func (b *Builder) String() string {
return string(b.buf)
}