给定以下程序,我将如何使用反射访问函数选项函数名?
package main
import (
"fmt"
"path"
"reflect"
"runtime"
"strings"
)
type config struct {
count int
name string
}
type OptionFn func(cfg *config)
func WithCount(count int) OptionFn {
return func(cfg *config) {
cfg.count = count
}
}
func WithName(name string) OptionFn {
return func(cfg *config) {
cfg.name = name
}
}
func printOptions(optFns ...interface{}) {
for _, optFn := range optFns {
fmt.Println(funcName(optFn))
optType := reflect.TypeOf(optFn)
fmt.Println(optType)
}
}
func main() {
printOptions(WithCount(4), WithName("golang"))
}
func funcName(opt interface{}) string {
n := runtime.FuncForPC(reflect.ValueOf(opt).Pointer()).Name()
return strings.TrimSuffix(path.Base(n), path.Ext(n))
}
当前printOptions
输出
main.main
main.OptionFn
main.main
main.OptionFn
预期printOptions
将输出
WithCount
WithName
用例是为功能选项创建模拟、测试和Assert机制。
1条答案
按热度按时间j8ag8udp1#
将选项声明为包含名称和函数字段的结构类型。
使用名称字段获取名称。
在选项工厂函数中设置名称字段:
https://go.dev/play/p/yxgXAAww77q