What is the easy way to make method from function in Go?

huangapple go评论91阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2016年1月12日 00:30:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/34726499.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定