go语言编码使用functional options是常见用法,但是在hot path处要慎用。
之前用go写过一个IO密集型的程序,pprof性能测试发现使用functional options竟然占用较多的CPU时间。经测试,直接对结构体的字段赋值,速度是使用functional options的一百倍。测试代码如下:
package main
import (
"fmt"
"time"
)
type user struct {
Age int
}
type userOpt func(*user)
func WithUserAge(age int) userOpt {
return func(u *user) {
u.Age = age
}
}
func main() {
u := &user{}
now := time.Now()
//f := WithUserAge
for i := 0; i < 100000000; i++ {
u.Age = i
//f(i)(u) //实测性能是上一行(直接赋值)的百分之一
}
diff := time.Since(now)
fmt.Printf("diff: %v\n", diff)
}