我是go语言和函数式编程的新手。
我的问题是:你能列举一下golang中匿名函数的好处吗?我从这篇site中了解到,匿名函数是“只需要运行一次而不需要引用的代码段”。但我找不到他们的好处。
发布于 2017-12-28 07:24:17
函数文字表示匿名函数。The specification mentions the primary benefit of function literals
函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,只要它们是可访问的,它们就会存活下来。
下面是一些匿名函数的用法示例:sort.Slice、http mux.HandleFunc、panic recovery、goroutines、filepath.Walk、ast.Inspect。
发布于 2017-12-28 07:36:45
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被定义为仅传递给main第一行上的http.HandleFunc调用?使用匿名函数,可以改为这样写:
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))
}当一个函数只需要在一个地方使用时,使用匿名函数可能是一个好主意,特别是当它的主体很小时。
发布于 2017-12-28 07:30:08
对于不存储在变量中并立即执行的函数文字,特定的用例是创建一个新的函数作用域,以便在其中运行defer。
举个例子,如果你使用sync.Mutex (在很多情况下应该用通道代替它,但那是另一个主题),你可以限定需要锁定某个互斥锁的代码的范围,并且仍然使用延迟解锁,而不会在整个函数运行期间锁定互斥锁。
如果您不想立即运行匿名函数,也可以将其推迟。这通常与recover一起使用,以处理函数调用中的死机。
https://stackoverflow.com/questions/47999605
复制相似问题