Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 戈朗变量代换_Variables_Go_Logging_Substitution - Fatal编程技术网

Variables 戈朗变量代换

Variables 戈朗变量代换,variables,go,logging,substitution,Variables,Go,Logging,Substitution,如何在go中使用变量替换 例如,我有以下代码: debug_level := "Info" log.Info("Debug Test") 我可以为log函数使用变量debug_level而不是传递直接参数吗?比如: debug_level := "Info" log.${debug_level}("Debug Test") 谢谢。Go是一种静态语言,不仅它的所有变量(包括函数)都是静态类型的,而且所有函数都是静态编译和链接的。也就是说,不做任何准备就不可能根据函数名动态调用函数 这样做的方法

如何在go中使用变量替换

例如,我有以下代码:

debug_level := "Info"
log.Info("Debug Test")
我可以为log函数使用变量debug_level而不是传递直接参数吗?比如:

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

谢谢。

Go是一种静态语言,不仅它的所有变量(包括函数)都是静态类型的,而且所有函数都是静态编译和链接的。也就是说,不做任何准备就不可能根据函数名动态调用函数

这样做的方法包括使用@icza提供的函数viarable、使用将名称映射到函数的映射、使用reflect(至少目前仅限于方法),或者使用插件和第三方加载程序加载预编译的Go包

从您的用例中我看到,使用地图是最简单的

var logFn = map[string]func(...interface{}) {
    "Info": log.Info,
    "Debug": log.Debug,
}
顺便说一句,按照日志记录级别编写日志是没有意义的

例如:


我想不出有哪一种情况您不能创建这样的映射,因为所有包都是在Go中静态链接的

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

改用函数变量:当前保存方法或函数名的变量可以是函数类型的变量,保存函数或方法值

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

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

func Error(args ...interface{}) {
    fmt.Print("[Error] ")
    fmt.Println(args...)
}
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 logger func(...interface{}) = Info

func main() {
    logger("something")
    logger = Error
    logger("Some other thing")
}
输出将是(在上尝试):

还要注意,这也适用于方法,而不仅仅适用于函数:

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

func Error(args ...interface{}) {
    fmt.Print("[Error] ")
    fmt.Println(args...)
}
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")
}
输出(在上尝试):


请参阅相关问题:

您试图实现的是通过替换值或将值动态传递给golang函数来动态创建函数名。因为第一个是不可能的,而第二个是可能的。如果我从上下文的角度来看,这与OP所问的不同。这不是替换,这只是将值分配给映射,并将函数作为值,然后使用映射的键调用函数。这不是我认为在戈兰不可能的替代。至少对于函数来说不是这样,但是对于字符串来说是这样。我认为这可以满足OP的需要。如果他真的想要那种替代,还有反射,只要它是一种类型的方法。是的,它可以做OP想要的,只要它是OP真正想要的。您能告诉我们如何使用反射来实现它吗?它将非常有用。它用于返回值而不是替换值。反射无法动态修改函数名。Golang是静态类型语言。OP ASQUED适用于动态类型语言,如PHP。您所做的是使用map键替换整个函数,而不是替换包日志中的函数。如果我没有错,可以使用用户定义的函数完成这些操作,然后调用预定义函数,如log.Fatal。我们不能用预定义的函数来实现这一点,或者我们可以吗?我要求OP将
log.${debug_level}
替换为调用golang package
log.Fatal
log.Println
。这个
func(l Logger)Error(args…interface{}){fmt.Print(“[Error]”)fmt.Println(args…}
是用户定义的函数,您可以在其中调用任何日志functions@Himanshu通过反射,您可以按名称调用方法。功能,你不能。