GO:查找/扫描结构/函数

标签 go

在 GO 中是否可以通过名称、标记或接口(interface)等条件查找结构或函数?即命令行任务/动词的一些东西?即:

func cmd1() {
    ...
}

func cmd2() {
    ...
}

...

func cmdN() {
}

func main() {
    // Inspect os.Args and call cmd{X}() based on args.
    ...
}

我不介意确切的机制是什么,以及最终目标是函数还是结构 - 目标是在没有任何样板代码的情况下让某些东西按约定工作。

最佳答案

你可以使用反射

package main

import (
    "flag"
    "fmt"
    "reflect"
)

var cmd command

type command struct{}

func (c command) execute(name string) {
    v := reflect.ValueOf(c)

    cmd := v.MethodByName(name)
    if !cmd.IsValid() {
        fmt.Println(name + " not a command")
        return
    }

    cmd.Call([]reflect.Value{})
}

func (c command) Cmd1() {
    fmt.Println("command 1")
}

func (c command) Cmd2() {
    fmt.Println("command 2")
}

func (c command) Cmd3() {
    fmt.Println("command 3")
}

func main() {
    flag.Parse()

    cmd.execute(flag.Arg(0))
}

或者您可以使用 map 。

package main

import (
    "flag"
    "fmt"
)

func cmd1() {
    fmt.Println("command 1")
}

func cmd2() {
    fmt.Println("command 2")
}

func cmd3() {
    fmt.Println("command 3")
}

var funcs = map[string]func(){
    "cmd1": cmd1,
    "cmd2": cmd2,
    "cmd3": cmd3,
}

func main() {
    flag.Parse()

    if f, ok := funcs[flag.Arg(0)]; ok {
        f()
    } else {
        fmt.Println(flag.Arg(0) + " command not found")
    }
}

关于GO:查找/扫描结构/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076165/

相关文章:

go - 在 Go 中使用 select 发送到 channel 有什么好处?

Golang - Crypto 的包函数 "Available()"未定义

golang : tls. LoadX509KeyPair 关闭 net.Conn?

interface - Go Interfaces 使用定义中的接口(interface)

go - 如何只构建,不运行

google-app-engine - 403 Forbidden 本地 Google Cloud Storage 调用

sql - 如何(预加载)自定义列上的联接表?

go - 在 Go 中是否有设计信号或事件 API 的首选方法?

go - 在 Go 中,是否可以写入控制台并读回?

pointers - 我如何比较 Go 中的指针?