Golang入门到项目实战 | golang闭包
Posted 一个热爱编程的通信人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang入门到项目实战 | golang闭包相关的知识,希望对你有一定的参考价值。
闭包可以理解成定义在一个函数内部的函数。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。或者说是函数和其引用环境的组合体。
闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境。 首先我们来看一个例子:
package main
import "fmt"
// 返回一个函数
func add() func(int) int
var x int
return func(y int) int
x += y
return x
func main()
var f = add()
fmt.Println(f(10))
fmt.Println(f(20))
fmt.Println(f(30))
fmt.Println("-----------")
f1 := add()
fmt.Println(f1(40))
fmt.Println(f1(50))
运行结果
[Running] go run "d:\\SynologyDrive\\软件开发\\go\\golang入门到项目实战\\goproject\\360duote.com\\pro01\\test.go"
10
30
60
-----------
40
90
变量f是一个函数并且它引用了其外部作用域中的x变量,此时f就是一个闭包。 在f的生命周期内,变量x也一直有效。 闭包进阶示例1:
package main
import "fmt"
func add(x int) func(int) int
return func(y int) int
x += y
return x
func main()
var f = add(10)
fmt.Println(f(10))
fmt.Println(f(20))
fmt.Println(f(30))
fmt.Println("----------")
f1 := add(20)
fmt.Println(f1(40))
fmt.Println(f1(50))
运行结果
[Running] go run "d:\\SynologyDrive\\软件开发\\go\\golang入门到项目实战\\goproject\\360duote.com\\pro01\\tempCodeRunnerFile.go"
20
40
70
----------
60
110
闭包进阶示例2:
package main
import (
"fmt"
"strings"
)
func makeSuffixFunc(suffix string) func(string) string
return func(name string) string
if !strings.HasSuffix(name, suffix)
return name + suffix
return name
func main()
jpgFunc := makeSuffixFunc(".jpg")
txtFunc := makeSuffixFunc(".txt")
fmt.Println(jpgFunc("test"))
fmt.Println(txtFunc("test"))
运行结果
[Running] go run "d:\\SynologyDrive\\软件开发\\go\\golang入门到项目实战\\goproject\\360duote.com\\pro01\\test.go"
test.jpg
test.txt
闭包进阶示例3:
package main
import (
"fmt"
)
func calc(base int) (func(int) int, func(int) int)
add := func(i int) int
base += i
return base
sub := func(i int) int
base -= i
return base
return add, sub
func main()
f1, f2 := calc(10)
fmt.Println(f1(1), f2(2))
fmt.Println(f1(3), f2(4))
fmt.Println(f1(5), f2(6))
运行结果
[Running] go run "d:\\SynologyDrive\\软件开发\\go\\golang入门到项目实战\\goproject\\360duote.com\\pro01\\test.go"
11 9
12 8
13 7
以上是关于Golang入门到项目实战 | golang闭包的主要内容,如果未能解决你的问题,请参考以下文章