使用函数名称作为参数

尔蒙

在Go中,您可以将函数作为参数传递,例如callFunction(fn func)例如:

package main

import "fmt"

func example() {
    fmt.Println("hello from example")
}

func callFunction(fn func) {
    fn()
}    

func main() {
    callFunction(example)
}

但是当它是结构的成员时是否可以调用一个函数呢?以下代码将失败,但为您提供了我所谈论的示例:

package main

import "fmt"

type Example struct {
    x int
    y int
}

var example Example

func (e Example) StructFunction() {
    fmt.Println("hello from example")
}

func callFunction(fn func) {
    fn()
}    

func main() {
    callFunction(example.StructFunction)
}

(我知道我在该示例中尝试做的事情有点奇怪。我遇到的确切问题并没有很好地扩展为一个简单的示例,但这是我问题的本质。但是,我也对此很感兴趣从学术角度来看)

zz

方法(不是“结构的成员”,而是任何命名类型的方法,不仅是结构)都是第一类值。Go 1.0.3尚未实现方法值,但是技巧版本(如即将发布的Go 1.1)具有支持方法值在此处引用整个部分:

方法值

如果表达式x具有静态类型T并且Mtype的方法集中Tx.M则称为方法值。方法值x.M是可以使用与方法调用相同的参数调用的函数值x.Mx在评估方法值期间对表达式进行评估并保存;然后,保存的副本将在任何调用中用作接收者,稍后可能会执行。

该类型T可以是接口或非接口类型。

如在上述方法表达的讨论中,考虑一结构类型T与两个方法,Mv,其接收器的类型为T,和Mp,其接收器的类型的*T

type T struct {
    a int
}

func (tv  T) Mv(a int) int         { return 0 }  // value receiver
func (tp *T) Mp(f float32) float32 { return 1 }  // pointer receiver

var t T
var pt *T
func makeT() T

表达方式

t.Mv

产生一个类型的函数值

func(int) int

这两个调用是等效的:

t.Mv(7)
f := t.Mv; f(7)

同样,表达式

pt.Mp

产生一个类型的函数值

func(float32) float32

与选择器一样,使用指针使用值接收器对非接口方法的引用将自动取消引用该指针:pt.Mv等效于(*pt).Mv

与方法调用一样,使用可寻址值的指针接收器对非接口方法的引用将自动采用该值的地址:t.Mv等效于(&t).Mv

f := t.Mv; f(7)   // like t.Mv(7)
f := pt.Mp; f(7)  // like pt.Mp(7)
f := pt.Mv; f(7)  // like (*pt).Mv(7)
f := t.Mp; f(7)   // like (&t).Mp(7)
f := makeT().Mp   // invalid: result of makeT() is not addressable

尽管上面的示例使用了非接口类型,但是从接口类型的值创建方法值也是合法的。

var i interface { M(int) } = myVal
f := i.M; f(7)  // like i.M(7)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

clojure函数名称作为参数

使用函数名称作为命令

使用其他函数名称作为参数来定义函数

将函数名称作为参数传递给mapply?

使用#defined函数名称作为dlsym的输入

如何将参数名称作为参数传递给函数

如何将函数中的参数名称作为列值返回?

如何将对象的函数名称作为参数传递

将函数名称作为脚本中的位置参数之一传递

为什么在这种情况下不能将函数名称作为参数传递?

将函数参数名称作为字符串传递

Python3:将函数名称作为参数传递

如何将参数名称作为参数传递?

在PHP中使用函数名称作为无关类的名称可以吗?

使用计算出的属性名称作为导出函数名称

破解我的代码-如何在JavaScript中的另一个函数中使用函数名称作为参数

使用内置函数名称作为属性或方法标识符是不好的做法吗?

如何获得函数名称作为字符串?

OCaml函数名称作为字符串

如何使用argparse参数作为函数名称

如何将子类的函数名称作为参数传递给python中的父类方法?

是否可以使用函数参数的名称作为接口的属性来动态键入函数的输出?

使用 window 对象通过函数名称作为字符串调用函数是否不安全?

将 ListBox 名称作为参数传递以在函数中使用 - ACCESS VBA

使用传入应用名称作为参数的bash函数创建Laravel5应用

在Postgresql中使用表和拓扑名称作为参数的函数或循环

R:使用data.frame列名称作为参数的调用函数

在宏中定义函数:不能使用限定名称作为参数

使用用户窗体和文本框名称作为函数的参数