首页 > 其他分享 >Go入门指南-6.9应用闭包:将函数作为返回值

Go入门指南-6.9应用闭包:将函数作为返回值

时间:2024-10-28 20:52:56浏览次数:9  
标签:闭包 return 函数 int Adder func Go 6.9 Add2

在程序 function_return.go 中我们将会看到函数 Add2 和 Adder 均会返回签名为 func(b int) int 的函数:

func Add2() (func(b int) int)
func Adder(a int) (func(b int) int)

函数 Add2 不接受任何参数,但函数 Adder 接受一个 int 类型的整数作为参数。

我们也可以将 Adder 返回的函数存到变量中(function_return.go)。

package main

import "fmt"

func main() {
	// make an Add2 function, give it a name p2, and call it:
	p2 := Add2()
	fmt.Printf("Call Add2 for 3 gives: %v\n", p2(3))
	// make a special Adder function, a gets value 2:
	TwoAdder := Adder(2)
	fmt.Printf("The result is: %v\n", TwoAdder(3))
}

func Add2() func(b int) int {
	return func(b int) int {
		return b + 2
	}
}

func Adder(a int) func(b int) int {
	return func(b int) int {
		return a + b
	}
}

输出:

Call Add2 for 3 gives: 5
The result is: 5

下例为一个略微不同的实现(function_closure.go):

package main

import "fmt"

func main() {
	var f = Adder()
	fmt.Print(f(1), " - ")
	fmt.Print(f(20), " - ")
	fmt.Print(f(300))
}

func Adder() func(int) int {
	var x int
	return func(delta int) int {
		x += delta
		return x
	}
}

函数 Adder() 现在被赋值到变量 f 中(类型为 func(int) int)。

输出:

1 - 21 - 321

三次调用函数 f 的过程中函数 Adder() 中变量 delta 的值分别为:1、20 和 300。

我们可以看到,在多次调用中,变量 x 的值是被保留的,即 0 + 1 = 1,然后 1 + 20 = 21,最后 21 + 300 = 321:闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。

这些局部变量同样可以是参数,例如之前例子中的 Adder(as int)

这些例子清楚地展示了如何在 Go 语言中使用闭包。

在闭包中使用到的变量可以是在闭包函数体内声明的,也可以是在外部函数声明的:

var g int
go func(i int) {
	s := 0
	for j := 0; j < i; j++ { s += j }
	g = s
}(1000) // Passes argument 1000 to the function literal.

这样闭包函数就能够被应用到整个集合的元素上,并修改它们的值。然后这些变量就可以用于表示或计算全局或平均值。

练习 6.9 不使用递归但使用闭包改写第 6.6 节中的斐波那契数列程序。

练习 6.10

学习并理解以下程序的工作原理:

一个返回值为另一个函数的函数可以被称之为工厂函数,这在您需要创建一系列相似的函数的时候非常有用:书写一个工厂函数而不是针对每种情况都书写一个函数。下面的函数演示了如何动态返回追加后缀的函数:

func MakeAddSuffix(suffix string) func(string) string {
	return func(name string) string {
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}
		return name
	}
}

现在,我们可以生成如下函数:

addBmp := MakeAddSuffix(".bmp")
addJpeg := MakeAddSuffix(".jpeg")

然后调用它们:

addBmp("file") // returns: file.bmp
addJpeg("file") // returns: file.jpeg

可以返回其它函数的函数和接受其它函数作为参数的函数均被称之为高阶函数,是函数式语言的特点。我们已经在第 6.7 中得知函数也是一种值,因此很显然 Go 语言具有一些函数式语言的特性。闭包在 Go 语言中非常常见,常用于 goroutine 和管道操作(详见第 14.8-14.9 节)。在第 11.14 节的程序中,我们将会看到 Go 语言中的函数在处理混合对象时的强大能力。

标签:闭包,return,函数,int,Adder,func,Go,6.9,Add2
From: https://blog.csdn.net/qq_45030264/article/details/143312745

相关文章

  • Go入门指南- 7.2. 切片
    7.2.1概念切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于C/C++中的数组类型,或者Python中的list类型)。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的......
  • Go入门指南-7.6字符串、数组和切片的应用
    7.6.1从字符串生成字节切片假设s是一个字符串(本质上是一个字节数组),那么就可以直接通过c:=[]byte(s)来获取一个字节数组的切片c。另外,您还可以通过copy函数来达到相同的目的:copy(dst[]byte,srcstring)。同样的,还可以使用for-range来获得每个元素(Listing7.1......
  • Go入门指南-8.4map 类型的切片
    假设我们想获取一个map类型的切片,我们必须使用两次make()函数,第一次分配切片,第二次分配切片中每个map元素(参见下面的例子8.4)。示例8.4maps_forrange2.go:packagemainimport"fmt"funcmain(){ //VersionA: items:=make([]map[int]int,5) fori:=ra......
  • 基于django+vue+Vue救援物资管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景救援物资管理在自然灾害、突发事件等紧急情况下扮演着至关重要的角色。现有研究主要集中在物资分配策略、库存管理以及物流优化等方面,但专......
  • 基于django+vue+Vue酒店经营管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着旅游业的蓬勃发展,酒店行业作为旅游业的重要组成部分,其管理效率和服务质量直接关系到客户体验和行业竞争力。关于酒店经营管理系统的研......
  • 基于django+vue+Vue酒店会员管理的设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着酒店行业的竞争日益激烈,会员管理成为提升客户忠诚度和酒店利润的重要手段。关于酒店会员管理的研究,现有文献主要集中在客户关系管理、......
  • (开题报告)django+vue心理健康科普微信小程序的设计与实现论文+源码
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于心理健康科普方面的研究,现有研究主要以传统的网页平台或线下方式为主。在国内外,虽然有众多心理健康相关的研究成果,但专门针对心理......
  • 毕业设计:python车牌识别+车辆管理+计费系统+可视化大屏+Django框架(源码)✅
    毕业设计:python车牌识别+车辆管理+计费系统+可视化大屏+Django框架(源码)✅1、项目介绍技术栈:Python语言、Django框架、MySQL数据库、Echarts可视化、车牌识别、停车场管理、停车收费、HTML亮点功能:[1]用户管理,可增加月卡,季卡,半年卡,年卡,临时停车等;[2]可配置停车场停车......
  • 大数据项目-基于Django实现的二手房数据可视化分析与价格预测
    《[含文档+PPT+源码等]精品基于Django实现的二手房数据可视化分析与价格预测》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!数据库管理工具:phpstudy/Navicat或者phpstudy/sqlyog后台......
  • Go语言的系统监控和日志分析
    ###开头段落:在处理Go语言的系统监控和日志分析时,关键的方式包括:使用标准库log进行日志记录、采用第三方库如logrus或zap提供更高级的日志管理功能、使用pprof进行性能监控、利用expvar发布服务内部信息等。这些方式既包含了基础的日志记录,也涵盖了性能和状态监控的高级应用。......