【发布时间】:2017-03-07 11:09:38
【问题描述】:
我最近在使用 golang 时遇到了以下问题。是否可以将函数体传递给函数调用,例如 javascript。
例如setTimeout(function(i){console.log("input:", i)}, 1000).
在 javascript 中将匿名函数传递给另一个函数是很常见的。我想知道在go中是否相同?
package main
import (
"fmt"
)
type HandlerFunc func(int)
func main() {
// define a function as object/variable?
hnd := func(in int){
fmt.Println("func handler returns input", in);
}
a:=HandlerFunc(hnd) //pass function object/variable to type HandlerFunc
a(10)
// pass function body directly to type HandlerFunc
b:=HandlerFunc(func(_in int){
fmt.Println("another func handler returns input", _in);
})
b(100)
fmt.Println("Hello, playground")
}
它们都有效,但我想知道这两种用途之间是否有任何区别,哪一种更可取?
【问题讨论】:
-
您没有在代码中传递函数,您只是将函数值存储在局部变量中,然后您调用。请参阅此相关问题:First class functions in Go
-
没什么区别。
-
谢谢@icza。我觉得应该没什么区别,但我的一位同事似乎不这么认为。我很好奇的是,我在网上找不到任何用第二种风格编写的代码,而它在 Javascript 中很常见(几周前我刚从 Javascript 切换到 Golang)。此外,Golang 的规范中没有提到堆和栈,看起来 Golang 很聪明,可以动态分配内存,让用户不会像 c/c++ 那样关心内存泄漏。我说的对吗?
标签: function go parameter-passing