Go 性能优化

string 与 []byte 互转

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

/*
type StringHeader struct { // reflect.StringHeader
    Data uintptr
    Len  int
}
type SliceHeader struct { // reflect.SliceHeader
    Data uintptr
    Len  int
    Cap  int
}
*/

func str2bytes(s string) []byte {
   x := (*[2]uintptr)(unsafe.Pointer(&s))
   b := [3]uintptr{x[0], x[1], x[1]}
   return *(*[]byte)(unsafe.Pointer(&b))
}

func bytes2str(b []byte) string {
   return *(*string)(unsafe.Pointer(&b))
}

大量字符串拼接

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

// bytes.Buffer
package main

import (
    "fmt"
    "bytes"
)

func main() {
    var b bytes.Buffer

    b.WriteString("abc")
    b.WriteString("def")

    fmt.Println(b.String()) // abcdef
}
// strings.Builder
package main

import (
    "fmt"
    "strings"
)

func main() {
    var sb strings.Builder
    sb.WriteString("First")
    sb.WriteString("Second")
    fmt.Println(sb.String())    // FirstSecond
}