go的闭包
点击查看代码
package main
import (
"fmt"
"strings"
"time"
)
func Adder() func(int) int {
var x int = 3
return func(d int) int {
x += d
return x
}
}
func testClosure1(){
f := Adder()
ret1 := f(1)
fmt.Printf("f(1)>> ret1=%d\n",ret1)
ret20 := f(20)
fmt.Printf("f(20)>> ret1=%d\n",ret20)
f1 := Adder()
ret11 := f1(1)
fmt.Printf("f1(10)>> ret11=%d\n",ret11)
ret201 := f1(20)
fmt.Printf("f1(12)>> ret201=%d\n",ret201)
}
func add(base int) func(int) int {
return func(i int) int {
base += i
return base
}
}
func makeSuffixFunc(suffix string)func(string) string {
return func(name string)string {
if !strings.HasSuffix(name,suffix){
return name + suffix
}
return name
}
}
func testClosure3(){
func1 := makeSuffixFunc(".bmp")
func2 := makeSuffixFunc(".jpg")
fmt.Println(func1("test"))
fmt.Println(func2("test"))
}
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 testClosure4(){
f1,f2 := calc(10)
fmt.Println(f1(1), f2(2))
fmt.Println(f1(3), f2(4))
fmt.Println(f1(5), f2(6))
fmt.Println(f2(7), f1(8))
}
func testClosure5(){
for i:=0; i<5; i++ {
go func() {
fmt.Println(i)
}()
}
time.Sleep(time.Second)
}
//这样还是不能修改成打印出正确的i, 此处的参数index没有使用上,所以会出问题,
func testClosure6(){
for i :=0; i<5; i++ {
go func(index int){
fmt.Println(i)
}(i)
}
time.Sleep(time.Second)
}
func testClosure7(){
for i :=0; i<50000; i++ {
go func(i int){
fmt.Println(i)
}(i)
}
time.Sleep(time.Second)
}
func main(){
//testClosure1()
//testClosure3()
//testClosure4()
//testClosure5()
testClosure6() // 这个问题不知道怎么改
testClosure7()
}
testClosure6() 输出:
点击查看代码
2
5
5
2
5
写入自己的博客中才能记得长久
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!