Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Go中的函数生成方法的简单方法是什么?_Go - Fatal编程技术网

从Go中的函数生成方法的简单方法是什么?

从Go中的函数生成方法的简单方法是什么?,go,Go,使用方法表达式从方法中获取函数非常简单 func (t T) Foo(){} Foo := T.Foo //yelds a function with signature Foo(t T) 现在假设我已经有了 func Foo(t T) 我可以不重写就获得方法T.Foo(),或者至少是简单的方法吗?假设T是一个结构,您可以: func (t T) Foo() { Foo(t) } 假设T是一个结构,您可以: func (t T) Foo() { Foo(t) }

使用方法表达式从方法中获取函数非常简单

func (t T) Foo(){}
Foo := T.Foo       //yelds a function with signature Foo(t T)
现在假设我已经有了

func Foo(t T)

我可以不重写就获得方法
T.Foo()
,或者至少是简单的方法吗?

假设T是一个结构,您可以:

func (t T) Foo() {
    Foo(t)
}

假设T是一个结构,您可以:

func (t T) Foo() {
    Foo(t)
}

如果希望保留函数
Foo(t)
,例如为了向后兼容,可以简单地定义一个调用现有函数的struct方法:

type T struct {
    // ...
}

func Foo(t T) {
    // ...
}

// Define new method that just calls the Foo function
func (t T) Foo() {
    Foo(t)
}

或者,您可以轻松地将函数签名从
func-Foo(t)
更改为
func(t)Foo()
。只要不更改
t
的名称,就不必再重写函数本身。

如果要保留函数
Foo(t)
,例如为了向后兼容,可以定义一个调用现有函数的结构方法:

type T struct {
    // ...
}

func Foo(t T) {
    // ...
}

// Define new method that just calls the Foo function
func (t T) Foo() {
    Foo(t)
}

或者,您可以轻松地将函数签名从
func-Foo(t)
更改为
func(t)Foo()
。只要不更改
t
的名称,就不必再重写函数本身。

其他人已经指出了最好的方法:

func (t T) Foo() { Foo(t) }
但如果出于某种原因需要在运行时执行此操作,则可以执行以下操作:

func (t *T) SetFoo(foo func(T)) {
    t.foo = foo
}

func (t T) CallFoo() {
    t.foo(t)
}
操场:


这显然不是你通常会做的事情。除非有原因,否则我建议坚持使用现有的方法和函数。

其他人已经指出了最好的方法:

func (t T) Foo() { Foo(t) }
但如果出于某种原因需要在运行时执行此操作,则可以执行以下操作:

func (t *T) SetFoo(foo func(T)) {
    t.foo = foo
}

func (t T) CallFoo() {
    t.foo(t)
}
操场:


这显然不是你通常会做的事情。除非有原因,否则我建议坚持使用现有的方法和函数。

是的,我明白,并且完全同意。你确定没有别的办法吗?我们能等一下奇迹般的答案吗?我想没有更好的解决办法了。丹尼尔没有错。只是有这么清楚和简洁的Foo:=T.Foo我想知道相反方向的相同情况,在实践中哪种情况更常见。在语义和技术上,操作看起来是对称的。是的,我明白,并且完全同意。你确定没有别的办法吗?我们能等一下奇迹般的答案吗?我想没有更好的解决办法了。丹尼尔没有错。只是有这么清楚和简洁的Foo:=T.Foo我想知道相反方向的相同情况,在实践中哪种情况更常见。从语义和技术上看,操作看起来是对称的。但是为什么必须是结构?
T
不需要是结构,只要是包中声明的任何类型。但是为什么必须是结构?
T
不需要是结构,只要是包中声明的任何类型。这很难看,但仍然是一个不错的想法这很难看,但仍然是一个不错的想法