drsxzut183207938 2014-07-14 16:20
浏览 13
已采纳

如何在结构上调用变量方法

I want to invoke a variable method on a struct like this example

type controller struct{}

func (c *controller) Index() {
    fmt.Println("index controller")
}

func invokeIt(action string) {
   (&controller{}).action    // don't work duh
   (&controller{})["action"] // this is Go not js
   // how can I invoke it? 
}

thx for the replies.

  • 写回答

1条回答 默认 最新

  • dongqiao8421 2014-07-14 16:29
    关注

    DHH, are you porting Rails to Go :) ?

    Jokes aside, this is exactly what reflect is for. For example:

    type Foo struct{}
    
    func (Foo) FooM() { fmt.Println("Foom") }
    
    func main() {
        foo := Foo{}
        reflect.ValueOf(foo).MethodByName("FooM").Call(nil)
    }
    

    Playground: http://play.golang.org/p/5ZGwlHLEmj

    EDIT: A more idiomatic way to do it would be to use interfaces, (as someone else had proposed, but then have deleted their answer). So if you want to, say, define something that can do CRUD, in Go you'd usually go with

    type Resources interface {
        Index()
        New()
        Show(id int)
        // ...
    }
    

    And maybe an Invoke method in order to invoke non-standard methods on this thing using reflect like above. reflect is very powerful and also a good way to shoot yourself in the foot, so it's never a good idea to overuse it.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab