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 關注
- 545 瀏覽
添加回答
舉報