字符串与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 底层数组扩容策略:

  1. grow 长度 N 小于等于 cap-len,不扩容
  2. 大于则将分配容量为 2xcap + N 的新底层数组并进行旧数据的拷贝

值得注意的是它们的写入不是并发安全的