字符串与IO
字符串与IO
零内存分配转换 string 和 byte
func String(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
func Str2Bytes(s string) []byte {
x := (*[2]uintptr)(unsafe.Pointer(&s))
h := [3]uintptr{x[0], x[1], x[1]}
return *(*[]byte)(unsafe.Pointer(&h))
}IO 操作
bufio.Reader VS bytes.Buffer
bufio 通常同于减少 read 或者是 write 的系统调用,其中对 io.Reader 和 io.Writer 进行了封装,而 bytes.Buffer 用于高效存储不定长的 byte
bytes.Buffer VS strings.Builder
如果是 go 1.10 以后的版本,使用 strings.Builder 存储不定长的 byte 可以有效避免大量的拷贝,strings.Builder 内部的追加直接追加到底层数组中,返回 string 的时候使用零内存分配
strings.Builder 底层数组扩容策略:
- grow 长度 N 小于等于 cap-len,不扩容
- 大于则将分配容量为 2xcap + N 的新底层数组并进行旧数据的拷贝
值得注意的是它们的写入不是并发安全的