golang 变量替换

golang variable substitution

如何在 go 中使用变量替换?

比如我有如下代码:

debug_level := "Info"
log.Info("Debug Test")

我可以为日志函数使用变量 debug_level 而不是直接传递参数吗?类似于:

debug_level := "Info"
log.${debug_level}("Debug Test")

谢谢。

Go是一门静态语言,不仅包括函数在内的所有变量都是静态类型的,而且所有函数都是静态编译的link。也就是说,没有任何准备.

是不可能根据函数名动态调用函数的。

这样做的方法包括使用@icza 提供的函数,使用将名称映射到函数的映射,使用反射(仅限于方法,至少目前如此),或使用插件和第 3 方loader 加载预编译的 Go 包。

从你的用例来看,使用地图是最简单的。

var logFn = map[string]func(...interface{}) {
    "Info": log.Info,
    "Debug": log.Debug,
}

顺便说一句,根据使用的日志级别来写日志真的没有意义。

示例:https://play.golang.org/p/drQzD1OH5ul

我想不出有什么情况会导致您无法创建这样的映射,因为所有包都是在 Go 中静态 linked 的。

Go 是一种静态类型的语言,如果您通过名称调用函数或方法,编译器无法检查您提供的参数是否与函数的签名匹配。

改为使用函数变量:当前保存方法或函数的变量 name 可以是函数类型的变量,保存 function 方法值 .

假设我们有以下日志功能:

func Info(args ...interface{}) {
    fmt.Print("[Info] ")
    fmt.Println(args...)
}

func Error(args ...interface{}) {
    fmt.Print("[Error] ")
    fmt.Println(args...)
}

你可以这样使用它:

var logger func(...interface{}) = Info

func main() {
    logger("something")
    logger = Error
    logger("Some other thing")
}

输出将是(在 Go Playground 上尝试):

[Info] something
[Error] Some other thing

另请注意,这也适用于方法,而不仅仅是函数:

type Logger struct{}

func (l Logger) Info(args ...interface{}) {
    fmt.Print("[Info] ")
    fmt.Println(args...)
}

func (l Logger) Error(args ...interface{}) {
    fmt.Print("[Error] ")
    fmt.Println(args...)
}

使用它:

var mainLogger = Logger{}

var logger func(...interface{}) = mainLogger.Info

func main() {
    logger("something")
    logger = mainLogger.Error
    logger("Some other thing")
}

输出(在 Go Playground 上尝试):

[Info] something
[Error] Some other thing

参见相关问题: