英文:
Store a generic function
问题
我想做类似这样的事情,但显然用这种方式是不可能的,我认为我漏掉了什么。
type command struct {
    help    string
    handler func(params ...interface{})
}
func showHelp(commands map[string]command) {
    fmt.Println("帮助:")
    for c, h := range commands {
        fmt.Println(c, "->", h.help)
    }
}
func main() {
    // 用于存储命令的映射
    commands := make(map[string]command)
    // 添加帮助命令
    commands["help"] = command{"显示此信息", showHelp}
}
以上是你提供的代码的翻译。
英文:
I would like to do something like this, but apparently it is not possible in this way, I think that there is something I miss.
type command struct {                                                            
    help string                                                                  
    handler func (params ...interface{})                                         
}                                                                                
                                                                             
func showHelp( commands map[string]command ) {                                   
    fmt.Println( "Help:" )                                                       
    for c, h := range commands {                                                 
        fmt.Println( c,"->" ,h.help )                                            
    }                                                                            
}                                                                                
                                                                             
func main() {                                                                
    // Map to store commands                                                     
    commands := make( map[string]command )                                       
                                                                             
    // Adding help command                                                       
    commands["help"] = command{ "show this information", showHelp }
}
答案1
得分: 1
你的代码中存在类型不匹配的问题,你的结构体成员期望一个 func(param ...interface{}) 类型,而你试图传递一个 func(map[string]command) 类型的函数给它。
关于接口类型的工作原理,请参考这里的解释。
如果你将代码修改如下,并且将结构体成员的类型简单地设置为 interface{},它就可以接受任何类型,包括函数类型,我认为这是你想要的。
package main
import "fmt"
type command struct {
	help    string
	handler interface{}
}
func showHelp(commands map[string]command) {
	fmt.Println("Help:")
	for c, h := range commands {
		fmt.Println(c, "->", h.help)
	}
}
func main() {
	// 用于存储命令的映射
	commands := make(map[string]command)
	// 添加帮助命令
	commands["help"] = command{"显示此信息", showHelp}
	showHelp(commands)
}
在Go Playground上尝试一下吧。
英文:
You have a type mismatch in that your struct member expects an func(param ...interface) and you are trying to pass it a func(map[string]command)
See here for the explanation on how interface types work.
If you change your code as below and give the struct member simply type interface{} it can take any type including a function which I think is what you want.
package main
import "fmt"
type command struct {
	help    string
	handler interface{}
}
func showHelp(commands map[string]command) {
	fmt.Println("Help:")
	for c, h := range commands {
		fmt.Println(c, "->", h.help)
	}
}
func main() {
	// Map to store commands
	commands := make(map[string]command)
	// Adding help command
	commands["help"] = command{"show this information", showHelp}
	showHelp(commands)
}
Try in on the Go Playground
答案2
得分: 0
我认为你正在寻找这样的代码:
package main
import "fmt"
type command struct {
	help    string
	handler func()
}
func main() {
	c := command{}
	c.handler = func() {
		fmt.Println("Hello, playground")
	}
	c.handler()
}
至少这是我会这样做。在你的结构体上放一个类型为func的字段,然后在方便的地方使用闭包将一个方法分配给它。
英文:
I think you're looking for something like this;
package main
import "fmt"
type command struct {                                                            
    help string                                                                  
    handler func()                                        
}   
func main() {
	c := command{}
	c.handler = func () { 
	fmt.Println("Hello, playground")
	}
	c.handler()
}
At least this is how I would do it. Put a field of type func on your struct then in whatever place is convenient use a closure to assign a method to it.
答案3
得分: 0
你的处理程序中需要使用类型断言 - 这是泛型的代价。你的设计虽然不符合惯用方式,但可以作为概念验证而工作。
package main
import "fmt"
type command struct {
	help    string
	handler func(params ...interface{})
}
func showHelp(commands ...interface{}) {
	fmt.Println("Help:")
	for c, h := range commands[0].(map[string]command) { // 在这里进行类型断言
		fmt.Println(c, "->", h.help)
	}
}
func main() {
	// 用于存储命令的映射
	commands := make(map[string]command)
	// 添加帮助命令
	commands["help"] = command{"显示此信息", showHelp}
	commands["help"].handler(commands)
}
可以在这里查看代码:https://play.golang.org/p/c67TVcorL1
英文:
You will need type assertion in your handlers - cost of generics. Your design as is, non-idiomatic but can work just as proof_of_concept.
package main
import "fmt"
type command struct {
	help    string
	handler func(params ...interface{})
}
func showHelp(commands ...interface{}) {
	fmt.Println("Help:")
	for c, h := range commands[0].(map[string]command) { //type assertion here
		fmt.Println(c, "->", h.help)
	}
}
func main() {
	// Map to store commands
	commands := make(map[string]command)
	// Adding help command
	commands["help"] = command{"show this information", showHelp}
	commands["help"].handler(commands)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论