您现在的位置是:群英 > 开发技术 > 编程语言
Go语言闭包的作用是什么,如何理解其底层原理
Admin发表于 2022-07-04 17:44:34741 次浏览
这篇文章主要给大家介绍“Go语言闭包的作用是什么,如何理解其底层原理”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“Go语言闭包的作用是什么,如何理解其底层原理”文章能对大家有所帮助。

一. 闭包概述
  • 闭包就是解决局部变量不能被外部访问的一种解决方案
  • 闭包是把函数当作返回值的一种应用

二. 代码演示

总体思想为:在函数内部定义局部变量,把另一个函数当作返回值,局部变量对于返回值函数相当于全部变量,所以多次调用返回值函数局部变量的值跟随变化。

// closure.go
package main
import (
	"fmt"
	"strings"
)
func main() {
	f := closure("http://", "com")
	fmt.Printf("%T %p \n", f, f)
	fmt.Println(f("baidu"))
	fmt.Println(f("qq"))
	fmt.Println(f("alipay.com"))
	fmt.Println("")
	f1 := closure("http://", "com")
	fmt.Printf("%T %p \n", f1, f1)
	fmt.Println(f1("baidu"))
	fmt.Println(f1("qq"))
	fmt.Println(f1("alipay.com"))
}
func closure(prefix, suffix string) func(url string) string {
	pre, suf := prefix, fmt.Sprintf(".%s", suffix)
	return func(url string) string {
		fmt.Printf("%p %p ", &pre, &suf)
		if !strings.HasPrefix(url, pre) {
			url = fmt.Sprintf("%s%s", pre, url)
		}
		if !strings.HasSuffix(url, suf) {
			url = fmt.Sprintf("%s%s", url, suf)
		}
		return url
	}
}

运行结果

$ go run closure.go
func(string) string 0x493560
0xc0000301d0 0xc0000301e0 http://baidu.com
0xc0000301d0 0xc0000301e0 http://qq.com
0xc0000301d0 0xc0000301e0 http://alipay.com

func(string) string 0x493560
0xc0000302d0 0xc0000302e0 http://baidu.com
0xc0000302d0 0xc0000302e0 http://qq.com
0xc0000302d0 0xc0000302e0 http://alipay.com

代码说明

第 2 行 返回的是变量 f 函数的 类型地址 ,函数在Go 语言中是引用类型。如果学过Java语言就知道,Java对象的内存空间有栈、堆、方法区、静态区。

第 3 - 5 行返回的是 pre suf 两个变量的地址,每一次调用是pre suf 地址都是不变的。

第 6 - 9 行这是新声明的 f1 变量,这时候 pre suf 的地址和上一次 f 的里面的 pre suf 地址是不一样的。

因为我们创建引用类型的变量时,其实只是一个标头值,标头值里包含一个指针,指针指向底层的数据,它所指向的底层结构没有被复制传递,这也引用类型比值类型传递更高效的原因。



通过以上内容的阐述,相信大家对“Go语言闭包的作用是什么,如何理解其底层原理”已经有了进一步的了解,更多相关的问题,欢迎关注群英网络或到群英官网咨询客服。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: Go语言闭包
相关信息推荐
2022-06-30 17:42:31 
摘要:builtin.go中error是一个interface,所以只需要创建一个包含Error() string函数的结构体即可,可以使用vim编辑器在error文件夹下新建errors.go包,实现NewError函数。
2022-08-01 17:11:30 
摘要:这篇文章主要介绍了Bootstrap Table实现定时刷新数据的方法,在这里小编比较推荐使用第二种方法,需要的朋友参考下吧
2022-08-27 17:03:52 
摘要:webpack中怎么压缩打包html资源?下面本篇文章就来给大家简单介绍一下webpack压缩打包html资源的方法,希望对大家有所帮助!
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部