go语言编程系列(五)

简介: go语言编程系列(五)

匿名函数

Go语言支持:函数,匿名函数和闭包

什么是匿名函数?

1、Go语言中,匿名函数是一种没有名字的函数,通常用于简单的逻辑处理或者作为其他函数的参数,它们可以像普通函数一样使用,并且不需要提前声明提前声明和定义。

2、当我们不希望给函数起名字的时候,可以使用匿名函数。

3、匿名函数由一个不带函数名的函数声明和函数体组成。

4、匿名函数通常是一次性函数,不希望再次使用。

匿名函数结构:


func() {//func body}() //花括号后加()表示函数调用,此处声明时为指定参数列表,

例子:


//如:func(a,b int) {  fmt.Println(a+b)}(1,2)// 把匿名函数赋值给一个变量fn := func(x, y int) int { return x + y }//下面是 完整变量定义格式var fn func(int,int) int = func(x, y int) int { return x + y }var fn = func(x, y int) int { return x + y }//通过函数变量进行调用fn(1,2)// fn的类型 func(int,int) int

表示参数列表的第一个括号必须紧挨着关键字func,因为匿名函数没有名称。

花括号{}涵盖着函数体,最后的一对括号表示对该匿名函数的调用。

使用匿名函数的两种方法:

①、直接对匿名函数进行调用:func(x,y int) int{return x+y}(3,4)

②、可以赋值于某个变量,如:fn:= func(x,y int) int{return x+y},然后通过变量名对函数进行调用:fn(1,2),赋值于某个变量,本质就是把匿名函数的内存地址保存到变量中。

总之:

在使用匿名函数时,我们可以将其直接作为函数当做参数传递给其他函数,或者将其赋值给变量,从而实现更加灵活的编程方式。同时,匿名函数也常用于实现简单的闭包,从而在程序中保留某些状态或者上下文信息。

闭包函数

1、闭包是函数式语言中的概念,没有研究过函数式语言的用户可能很难理解闭包的强大。

2、Go语言是支持闭包的,这里只是简单地写一下在Go语言中闭包是如何实现的。

3、匿名函数式无需定义标示符(函数名)的函数:而闭包是指能够访问自由变量的函数。

4、换句话说,定义在闭包中的函数可以记忆它被创建时候的环境。闭包函数=匿名函数+环境变量。

5、总的来说,在go中,闭包函数是一种特殊的匿名函数,可以访问其他外部作用域中的变量,并在函数内部持久化存储它们。这使得闭包函数非常有用,可以实现很多高级编程技巧。

以下是一个使用闭包函数的示例:


func Counter() func() int {  i := 0 // 环境变量:匿名函数,可以访问到的,外部作用域中的变量  return func() int {  i++  return i }}

闭包的使用


c1 := basic.Counter()fmt.Println(c1())fmt.Println(c1())c2 := basic.Counter()fmt.Println(c2())fmt.Println(c2())

运行的结果


1212

在该示例中,我们定义了一个名为counter的函数,它返回一个闭包函数,闭包函数内部定义了一个整数类型的变量i,并返回一个无参的匿名函数。这个匿名函数在每次被调用时都会将i的值加1,并返回这个新值。由于闭包函数可以访问其外部作用域中的变量,因此它可以持久化存储变量i的状态。

在main函数中,我们首先通过counter函数创建了一个闭包函数c1,连续调用了c1()两次,并打印其结果到控制台上。这将输出1和2,表示闭包函数成功地持久化存储了变量i的状态。

接下来,我们再次调用counter函数创建了一个新的闭包函数c2,同样连续调用了c2()两次,并打印其结果到控制台上,这将输出1和2,但是与c1的结果完全独立,因为每个闭包函数都有自己的变量状态。

通过使用闭包函数,我们可以轻松地实现很多高级编程技巧,例如延长计算,惰性求值,缓存等。需要注意的是,在使用闭包函数时,我们需要特别注意变量的生命周期和作用域,以避免出现内存泄漏和其他错误。

相关文章
|
7月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
373 2
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
9月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
566 1
|
9月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
571 0
|
9月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
400 0
|
9月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
450 0
|
9月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
503 0
|
11月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
9月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。

热门文章

最新文章