Go语言 如何访问功能选项功能名称

njthzxwz  于 2023-05-20  发布在  Go
关注(0)|答案(1)|浏览(185)

给定以下程序,我将如何使用反射访问函数选项函数名?

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机制。

j8ag8udp

j8ag8udp1#

将选项声明为包含名称和函数字段的结构类型。

type Option struct {
    name string
    fn   func(cfg *config)
}

使用名称字段获取名称。

func printOptions(opts ...Option) {
    for _, opt := range opts {
        fmt.Println(opt.name)
    }
}

在选项工厂函数中设置名称字段:

func WithCount(count int) Option {
    return Option{"WithCount", func(cfg *config) {
        cfg.count = count
    }}
}

func WithName(name string) Option {
    return Option{"WithName", func(cfg *config) {
        cfg.name = name
    }}
}

https://go.dev/play/p/yxgXAAww77q

相关问题