2 回答
TA贡献1860条经验 获得超9个赞
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{}) = 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
- 2 回答
- 0 关注
- 485 浏览
添加回答
举报