Functional options in Go

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)
}