英文:
What is the easy way to make method from function in Go?
问题
从方法中获取函数并使用方法表达式是相当简单的。
func (t T) Foo(){}
Foo := T.Foo // 生成一个具有签名 Foo(t T) 的函数
现在假设我已经有了
func Foo(t T)
我能否在不重写的情况下获取方法 T.Foo()
,或者至少有简单的方法吗?
英文:
It's quite trivial to get function from method using method expression
func (t T) Foo(){}
Foo := T.Foo //yelds a function with signature Foo(t T)
Now suppose I already have
func Foo(t T)
can I get method T.Foo()
without rewriting, or at least easy way?
答案1
得分: 3
如果你想保留函数Foo(t T)
,例如为了向后兼容,你可以简单地定义一个结构体方法来调用已经存在的函数:
type T struct {
// ...
}
func Foo(t T) {
// ...
}
// 定义一个新的方法,只是调用了Foo函数
func (t T) Foo() {
Foo(t)
}
另外,你也可以很容易地将函数签名从func Foo(t T)
改为func (t T) Foo()
。只要你不改变t
的名称,你就不需要进一步重写函数本身。
英文:
If you want to keep the function Foo(t T)
, for example for backwards-compatibility, you can simply define a struct method that calls the already-existing function:
type T struct {
// ...
}
func Foo(t T) {
// ...
}
// Define new method that just calls the Foo function
func (t T) Foo() {
Foo(t)
}
Alternatively, you can easily change the function signature from func Foo(t T)
to func (t T) Foo()
. As long as you do not change the name of t
, you will not have to rewrite the function itself any further.
答案2
得分: 2
假设T是一个结构体,你可以这样做:
func (t T) Foo() {
Foo(t)
}
这段代码的作用是在结构体T上定义一个方法Foo,该方法会调用函数Foo,并将结构体T作为参数传递给函数Foo。
英文:
Assuming T is a struct, you could:
func (t T) Foo() {
Foo(t)
}
答案3
得分: 1
其他人已经指出了实现这个的最佳方法:
func (t T) Foo() { Foo(t) }
但是如果出于某种原因你需要在运行时实现这个,你可以这样做:
func (t *T) SetFoo(foo func(T)) {
t.foo = foo
}
func (t T) CallFoo() {
t.foo(t)
}
Playground: http://play.golang.org/p/A3G-V0moyH.
显然,这不是你通常会做的事情。除非有理由,我建议坚持使用方法和函数的原始形式。
英文:
Others have already pointed out the best way to do this:
func (t T) Foo() { Foo(t) }
But if you for some reason need to do this at runtime, you can do something like this:
func (t *T) SetFoo(foo func(T)) {
t.foo = foo
}
func (t T) CallFoo() {
t.foo(t)
}
Playground: http://play.golang.org/p/A3G-V0moyH.
This is obviously not something you would normally do. Unless there is a reason, I'd suggest sticking with methods and functions as they are.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论