在Go语言中,是否可以有一个指向带参数的成员函数/方法的指针?

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

In Go is it possible to have a pointer to a member function/method that takes parameters?

问题

如果我有以下代码:

type Foo struct {
    // 一些数据
}

func (f *Foo) Op1() bool {
    // 执行操作并返回一个布尔值
}

func (f *Foo) Op2(other int) bool {
    // 使用内部数据和传入的参数执行不同的操作
}

我知道我可以存储对第一个方法的指针。

fn := f.Op1

并调用它

if fn(f) { // 做一些事情 }

但是如果我想对Op2做同样的事情怎么办?
我目前通过定义一个包装函数来模拟它,该函数接受一个Foo和值,并调用操作。但这是很多样板代码。

英文:

If I have

type Foo struct {
    // some data
}

func (f *Foo) Op1() bool {
    // perform operation and return a bool
}

func (f *Foo) Op2(other int) bool {
    // perform a different operation using internal data
    // and the passed in parameter(s)
}

I know I can store a pointer to the first method.

fn := f.Op1

and call it

if fn(f) { // do something }

But what if I want to do the same with Op2?
I am currently faking it by defined a wrapper function which takes a Foo and the values and calls the operation. But that is a lot of boiler plate code.

答案1

得分: 4

使用方法表达式

在这种情况下,我们从类型中获取一个引用,然后需要将实例作为第一个参数传递。

fn2 := (*Foo).Op2
f := &Foo{}
fn2(f, 2)

引用实例方法

在这种情况下,实例已经绑定到方法上,你只需要提供参数即可:

fn2 := f.Op2
fn2(2)

Playground: https://play.golang.org/p/e0gUIHzj7Z

英文:

Using method expressions

In this case, we get a reference from the type, then you need to pass an instance as the first argument.

fn2 := (*Foo).Op2
f := &Foo{}
fn2(f, 2)

Referencing an instance method

In this case, the instance is already bind to the method and you can just provide the arguments:

fn2 := f.Op2
fn2(2)

Playground: https://play.golang.org/p/e0gUIHzj7Z

huangapple
  • 本文由 发表于 2017年9月13日 05:24:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/46185540.html
匿名

发表评论

匿名网友

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

确定