慕码人2483693

Go是一种静态类型的语言,如果您要按名称调用函数或方法,则编译器将无法检查您提供的参数是否与函数的签名匹配。而是使用函数变量:当前保存方法或函数名称的变量可以是保存函数或方法value的函数类型的变量。假设我们具有以下日志记录功能:func Info(args ...interface{}) {    fmt.Print("[Info] ")    fmt.Println(args...)}func Error(args ...interface{}) {    fmt.Print("[Error] ")    fmt.Println(args...)}您可以这样使用它:var logger func(...interface{}) = Infofunc 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.Infofunc main() {    logger("something")    logger = mainLogger.Error    logger("Some other thing")}输出(在Go Playground上尝试):[Info] something[Error] Some other thing
0 0