广告
返回顶部
首页 > 资讯 > 后端开发 > GO >浅析Go语言中闭包的使用
  • 205
分享到

浅析Go语言中闭包的使用

Go语言闭包使用Go语言闭包Go闭包 2022-12-08 20:12:45 205人浏览 八月长安
摘要

目录闭包基本介绍闭包实现数字累加代码说明代码分析闭包案例上代码代码说明闭包基本介绍 闭包就是 一个函数 和其相关的 引用环境 组合的一个整体

闭包基本介绍

闭包就是 一个函数 和其相关的 引用环境 组合的一个整体

好处: 保存引用的变量,下次继续使用,不会销毁

下面通过闭包的方式,写一个数字累加器,体验一下闭包的妙处

闭包实现数字累加

package main

import "fmt"

// 累加器
// 闭包 - 函数柯里化
// 返回值类型: func(int) int
func AddUpper() func(int) int {
	var n int = 100
	return func(i int) int {
		n = n + i
		return n
	}
}

func main() {
	f := AddUpper()
	fmt.Println(f(1)) // 101
	fmt.Println(f(2)) // 103
	fmt.Println(f(3)) // 106
}

代码说明

1.AddUpper是一个函数,返回的数据类型 func(int) int

2.闭包的说明

返回的是一个匿名函数,但是这个匿名函数引用到了函数外的变量 n ,因此这个匿名函数就和 n 形成一个整体,构成闭包

3.当反复调用 f 函数时,因为 n 只初始化一次,保存了变量的值,因此每调用一次就相当于进行了累加。

4.我们要搞清楚闭包,关键就是要分析返回的函数使用到哪些变量

代码分析

这里我引入了一个字符串变量str,来帮助分析闭包是怎么保存变量的。

package main

import (
	"fmt"
)

// 累加器
// 闭包 - 函数柯里化
// 返回值类型: func(int) int
func AddUpper() func(int) int {
	var n int = 100
	var str = "hello"
	return func(i int) int {
		n = n + i
		fmt.Println("i=", i)
		str += string(36) // ascii 36 = '$'
		fmt.Printf("str==%s\n", str)
		return n
	}
}

func main() {
	f := AddUpper()
	// fmt.Println(AddUpper()(1)) // 101
	fmt.Println("f(1)=", f(1)) // 101
	fmt.Println("f(2)=", f(2)) // 103
	fmt.Println("f(3)=", f(3)) // 106
}


i= 1
str==hello$
f(1)= 101
i= 2
str==hello$$
f(2)= 103
i= 3
str==hello$$$
f(3)= 106

从输出可以看出来,闭包引用的变量nstr并没有在调用函数的时候重复声明,而是保留了下次函数调用后更新的值。

闭包案例

需求:

  • 编写一个函数 makeSuffix(suffix string) ,可以接收一个文件后缀名,并返回一个闭包
  • 调用闭包,可以传入一个文件名,如果该文件名没有指定后缀,则返回 文件名.jpg ,如果已经有.jpg,则返回原文件名。

strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀。

上代码

package main

import (
	"fmt"
	"strings"
)

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

// 传统写法
func makeSuffixV2(suffix string, name string) string {
	if !strings.HasSuffix(name, suffix) {
		return name + suffix
	}
	return name
}

func main() {
	// 闭包调用
	f := makeSuffix(".jpg")
	fmt.Println(f("xiao"))         // xiao.jpg
	fmt.Println(f("xiaoxiao.jpg")) // xiaoxiao.jpg
	fmt.Println(f("xiaoxiao.666")) // xiaoxiao.666.jpg

	// 传统写法调用
	fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "allblue"))  // makeSuffixV2= allblue.jpg
	fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "all.blue")) // makeSuffixV2= all.blue.jpg
}

代码说明

返回的匿名函数和 makeSuffix(suffix string) 的 suffix 变量组合成一个闭包

传统写法和闭包写法实现效果一样,但是,传统写法需要重复写变量, 比如上面的

makeSuffixV2(".jpg", "all.blue"))

闭包则解决了这个问题,是代码看起来更加的简洁

闭包的好处之一: 参数复用

好处: 保存引用的变量,下次继续使用,不会销毁

到此这篇关于浅析Go语言中闭包的使用的文章就介绍到这了,更多相关Go语言闭包内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 浅析Go语言中闭包的使用

本文链接: https://www.lsjlt.com/news/174421.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析Go语言中闭包的使用
    目录闭包基本介绍闭包实现数字累加代码说明代码分析闭包案例上代码代码说明闭包基本介绍 闭包就是 一个函数 和其相关的 引用环境 组合的一个整体 ...
    99+
    2022-12-08
    Go语言闭包使用 Go语言闭包 Go 闭包
  • Go语言中的闭包实例分析
    这篇文章主要介绍“Go语言中的闭包实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言中的闭包实例分析”文章能帮助大家解决问题。一、函数的变量作用域和可见性全局变量在main函数执行之前初...
    99+
    2023-07-02
  • Go语言中的闭包怎么使用
    这篇文章主要讲解了“Go语言中的闭包怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中的闭包怎么使用”吧!闭包基本介绍闭包就是 一个函数 和其相关的&nbs...
    99+
    2023-07-04
  • Go语言中基础闭包的示例分析
    这篇文章将为大家详细讲解有关Go语言中基础闭包的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一. 闭包概述闭包就是解决局部变量不能被外部访问的一种解决方案闭包是把函数当作返回值的一种应用二. 代...
    99+
    2023-06-25
  • Go语言中的闭包详解
    一、函数的变量作用域和可见性 1.全局变量在main函数执行之前初始化,全局可见 2.局部变量在函数内部或者if、for等语句块有效,使用之后外部不可见 3.全局变量和局部变量同名的...
    99+
    2022-11-13
  • go语言K8S 的 informer机制浅析
    目录正文使用方法创建Informer工厂创建对象Informer结构体注册事件方法启动Informer机制解析ReflectorControllerProcesser & L...
    99+
    2022-11-11
  • go语言中闭包共享变量问题示例分析
    这篇文章将为大家详细讲解有关go语言中闭包共享变量问题示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。直接看代码和注释:package mainimport ( &nb...
    99+
    2023-06-14
  • 浅析go语言中gopath环境的设置和使用方法
    Go语言是一种高效、可靠的编程语言,它被广泛用于Web开发、系统编程等领域。在使用Go语言编程时,设置GOPATH是非常重要的一步。本文将介绍如何设置golang的GOPATH。一、什么是GOPATHGo语言的工作空间(workspace)...
    99+
    2023-05-14
    go语言 Golang GOPATH
  • Go语言基础闭包的原理分析示例详解
    目录一. 闭包概述二. 代码演示运行结果代码说明一. 闭包概述 闭包就是解决局部变量不能被外部访问的一种解决方案 闭包是把函数当作返回值的一种应用 二. 代码演示...
    99+
    2022-11-12
  • Go语言中init函数与匿名函数使用浅析
    目录init函数基本介绍注意事项和细节案例匿名函数介绍调用方式方式1方式2init函数 基本介绍 每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架...
    99+
    2023-01-16
    Go init函数与匿名函数 Go init函数 Go匿名函数
  • 一文浅析Golang中的闭包
    1、什么是闭包?在真正讲述闭包之前,我们先铺垫一点知识点:函数式编程函数作用域作用域的继承关系【相关推荐:Go视频教程】1.1 前提知识铺垫1.2.1 函数式编程函数式编程是一种编程范式,看待问题的一种方式,每一个函数都是为了用小函数组织成...
    99+
    2023-05-14
    闭包 Go 后端
  • 浅析Go语言容器之数组和切片的使用
    目录序列容器数组VectorDequeList单链表总结在 Java 的核心库中,集合框架可谓鼎鼎大名:Array 、List、Set、Queue、HashMap 等等,随便拎一个出...
    99+
    2022-11-11
  • 浅析go语言设置网卡的方法
    Go是一门跨平台的编程语言,拥有强大的网络编程库,可以满足各种网络编程需求。在实际应用中,我们经常需要控制网络接口,例如设置网卡IP地址、MAC地址等。本文将介绍如何使用Go语言设置网卡。获取网卡列表在Go语言中,可以通过net.Inter...
    99+
    2023-05-14
  • Go语言中的包Package怎么使用
    本文小编为大家详细介绍“Go语言中的包Package怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中的包Package怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题一、Go使用Pac...
    99+
    2023-07-02
  • 对Go语言中的context包源码分析
    目录一、包说明分析二、包结构分析三、Context接口类型分析四、后续分析规划五、基于实现类型到常用函数六、With-系列函数七、扩展功能以及如何扩展八、补充一、包说明分析 cont...
    99+
    2022-11-13
  • 浅析go语言实现的一些常用功能
    Golang(或也称为Go语言)是Google于2009年推出的一种新型编程语言,因其高效、简单、可靠性强等特点,近年来在IT领域越来越受到注目。本文将介绍Golang的一些基本原理以及如何使用它实现一些常用的功能。一、Golang的基本原...
    99+
    2023-05-14
    go语言 Golang
  • Go语言中flag包如何使用
    今天就跟大家聊聊有关Go语言中flag包如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这一章所学的任何代码,都要编译成.exe才能跑,禁止右...
    99+
    2022-10-19
  • Go语言中unsafe包怎么使用
    本文小编为大家详细介绍“Go语言中unsafe包怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中unsafe包怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. 什么是unsafe包un...
    99+
    2023-07-05
  • Go语言包如何使用
    本篇内容介绍了“Go语言包如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!包(package)是多个Go源码的集合,是一种高级的代码复...
    99+
    2023-07-04
  • C语言浅析指针的使用
    目录指针等价形式转换函数指针主函数指针 指针是一个变量 (1) 作用:只能存储地址的值 (2) 大小:32位操作系统中占4字节;64位操作系统中占8字节 (3) 取地址:& ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作