首页后端开发其他后端知识Go语言闭包的作用是什么,如何理解其底层原理

Go语言闭包的作用是什么,如何理解其底层原理

时间2024-03-26 18:16:03发布访客分类其他后端知识浏览855
导读:这篇文章主要给大家介绍“Go语言闭包的作用是什么,如何理解其底层原理”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“Go语言闭包的作用是什么,如何理解其底层原理”文章能对大...
这篇文章主要给大家介绍“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语言闭包的作用是什么,如何理解其底层原理”已经有了进一步的了解,更多相关的问题,欢迎关注网络或到官网咨询客服。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Go语言闭包的作用是什么,如何理解其底层原理
本文地址: https://pptw.com/jishu/653673.html
PHP中array_map与array_walk的用法分别是什么? JS内存与性能问题有哪些,怎样解决

游客 回复需填写必要信息