go 不支持直接将不同签名的函数统一存入同一类型字段,但可通过 interface{} 实现灵活存储;本文详解其原理、正确用法及潜在风险,并提供可运行示例。
在 Go 中,函数是一等公民,但函数类型是严格协变的:func(map[string]command) 与 func(…interface{}) 是完全不同的类型,无法互相赋值。你最初定义的 handler func(params …interface{}) 期望接收可变参数,而 showHelp 的实际签名是 func(commands map[string]command),二者不兼容——这正是编译器报错的根本原因。
✅ 正确方案:使用 interface{} 存储任意函数
最简洁且符合 Go 风格的解法是将 handler 字段声明为 interface{}:
type command struct {
help string
handler interface{}
}
interface{} 可容纳任何值(包括函数),因此 showHelp(类型为 func(map[string]command))能被无损赋值: