存储通用功能

时间:2015-04-15 16:06:10

标签: go

我想做这样的事情,但显然不可能以这种方式,我认为有一些我想念的东西。

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 }
}

3 个答案:

答案 0 :(得分:1)

你的类型不匹配,你的struct成员需要一个func(param ...接口),而你试图传递一个func(map [string]命令)

有关接口类型如何工作的说明,请参阅here

如果您更改下面的代码并给结构成员简单地键入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() {
    // Map to store commands
    commands := make(map[string]command)

    // Adding help command
    commands["help"] = command{"show this information", showHelp}
    showHelp(commands)
}

尝试Go Playground

答案 1 :(得分: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()
}

至少我会这样做。在你的struct上放一个func类型的字段然后在任何方便的地方使用一个闭包来为它分配一个方法。

答案 2 :(得分:0)

您需要在处理程序中使用类型断言 - 泛型的成本。你的设计是非惯用的,但可以像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)
}

作品https://play.golang.org/p/c67TVcorL1