英文:
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论