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
参见相关问题:
如何在 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
参见相关问题: