首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在运行时绑定方法吗?

可以在运行时绑定方法吗?
EN

Stack Overflow用户
提问于 2011-08-14 23:06:13
回答 3查看 118关注 0票数 2

我有以下结构:

代码语言:javascript
复制
type Foo struct {
    Bar func(foo *Foo) bool
}

因为Bar不是一个真正的方法,所以它接受Foo作为参数(就像Python绑定方法中的self )。但是,如果有一种简单的方法,我会将它绑定到结构作为一个方法。我想我可以使用反射,但我想让它变得简单。是否有将函数绑定到结构的诀窍?你会怎么做?

编辑:我将为我正在做的事情添加一个具体的示例。

代码语言:javascript
复制
type Route struct {
    Matcher func(route *Route, r *http.Request) bool
}

Route接受自定义的Matcher函数。如果未设置,则在注册路由时设置默认匹配器功能:

代码语言:javascript
复制
func (mux *ServeMux) HandleRoute(r Route) {
    // ...

    // Set default matcher.
    if r.Matcher == nil {
        r.Matcher = mux.RouteMatcher
    }

    // ...
}

然后使用该函数进行匹配:

代码语言:javascript
复制
func (mux *ServeMux) Match(r *http.Request) Route {
    // ...

    if route.Matcher(&route, r) {
        ...
    }

    ...
}

函数未绑定到路由。我的问题是,这是否是设置自定义可调用函数的合理/惯用方式,或者是否存在将函数“绑定”到结构作为方法的诀窍。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-14 23:47:19

你不会解释你想要实现的目标。这有什么问题呢?

代码语言:javascript
复制
package main

import "fmt"

type Foo struct{}

func (f *Foo) Bar() bool {
    return true
}

func main() {
    var f Foo
    fmt.Println(f.Bar())
}

输出:

代码语言:javascript
复制
true

你是不是想做这样的事情?

代码语言:javascript
复制
package main

import "fmt"

type BarFunc func(foo *Foo) bool

type Foo struct {
    BarFunc
}

func (f *Foo) Bar() bool {
    return f.BarFunc(f)
}

func UserBarFunc(foo *Foo) bool { return true }

func main() {
    var f Foo
    f.BarFunc = UserBarFunc
    fmt.Println(f.Bar())
}

输出:

代码语言:javascript
复制
true
票数 2
EN

Stack Overflow用户

发布于 2011-08-15 04:48:16

不可能在运行时绑定新方法。编译器需要知道类型在编译时有哪些方法。考虑下面的代码:

代码语言:javascript
复制
package main

import "rand"

type Foo struct {}

type Bar interface {
    Baz()
}

func main() {
    if rand.Intn(2) != 0 {
        // code to bind method Baz to Foo at runtime
    }

    var f Foo

    // Should this compile? It depends on whether or not the if
    // statement above ran, which can only be known at runtime.
    f.Baz()

    // Same here. The compiler can't know whether or not f has
    // a method Baz.
    var b Bar = f
}

您的示例代码看起来是做您想做的事情的一种合理方式。PeterSO的答案提供了另一种方法,使函数看起来更像一个常规方法。

票数 2
EN

Stack Overflow用户

发布于 2011-08-15 05:32:37

创建一个具有所需名称(Bar)的帮助器方法以在运行时选择和调用所需的函数如何?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7057579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档