Go 性能优化

string 与 []byte 互转

利用了底层 string 和 byte slice 实现的技巧,如果需要大量互转可以使用这种方式。

  1. /*
  2. type StringHeader struct {
  3. Data uintptr
  4. Len int
  5. }
  6. type SliceHeader struct {
  7. Data uintptr
  8. Len int
  9. Cap int
  10. }
  11. */
  12. func str2bytes(s string) []byte {
  13. x := (*[2]uintptr)(unsafe.Pointer(&s))
  14. b := [3]uintptr{x[0], x[1], x[1]}
  15. return *(*[]byte)(unsafe.Pointer(&b))
  16. }
  17. func bytes2str(b []byte) string {
  18. return *(*string)(unsafe.Pointer(&b))
  19. }

字符串拼接

大量字符串拼接不要用 + ,使用 bytes.Buffer 或者 strings.Builder

  1. // bytes.Buffer
  2. package main
  3. import (
  4. "fmt"
  5. "bytes"
  6. )
  7. func main() {
  8. var b bytes.Buffer
  9. b.WriteString("abc")
  10. b.WriteString("def")
  11. fmt.Println(b.String()) // abcdef
  12. }
  1. // strings.Builder
  2. package main
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7. func main() {
  8. var sb strings.Builder
  9. sb.WriteString("First")
  10. sb.WriteString("Second")
  11. fmt.Println(sb.String()) // FirstSecond
  12. }