我是go语言和函数式编程的新手。
我的问题是:但是你可以列举golang中匿名函数的好处吗?我从这个site中了解到,匿名函数是“段代码,只需要运行一次而不需要引用”。但我找不到他们的好处。
答案 0 :(得分:3)
函数文字表示匿名函数。 specification mentions the primary benefit of function literals:
函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围函数和函数文本之间共享,只要它们可以访问,它们就会存在。
以下是匿名函数的一些使用示例:sort.Slice,http mux.HandleFunc,panic recovery,goroutines,filepath.Walk,ast.Inspect。
答案 1 :(得分:1)
来自Go documentation for net/http
。
这是一个处理路径/hello
的简单Web服务器:
package main
import (
"io"
"net/http"
"log"
)
// hello world, the web server
func HelloServer(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "hello, world!\n")
}
func main() {
http.HandleFunc("/hello", HelloServer)
log.Fatal(http.ListenAndServe(":12345", nil))
}
您是否注意到函数HelloServer
仅定义为传递给http.HandleFunc
第一行main
的调用?使用匿名函数可以改写:
package main
import (
"io"
"net/http"
"log"
)
func main() {
http.HandleFunc("/hello", func (w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "hello, world!\n")
})
log.Fatal(http.ListenAndServe(":12345", nil))
}
当一个函数只需要在一个地方使用时,使用匿名函数可能是个好主意,特别是当它的主体很小时。
答案 2 :(得分:0)
未存储在变量中并立即执行的函数文字的特定用例是创建一个新的函数作用域来运行defer
。
例如,如果您使用sync.Mutex
(在很多情况下应该用通道替换,但这是另一个主题),您可以查看需要锁定某个互斥锁并仍然使用的一段代码在整个函数运行期间,在不保持互斥锁被锁定的情况下推迟解锁。
如果您不想立即运行,也可以推迟匿名函数。这通常与recover
一起用于处理函数调用中的恐慌。