Go语言基础闭包的原理分析示例详解

 更新时间:2021年11月16日 16:21:35   作者:枫少文  
这篇文章主要为大家介绍了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语言基础闭包的底层原理及实例详解的详细内容,更多关于Go语言闭包的资料请关注脚本之家其它相关文章!

相关文章

  • Go语言学习技巧之命名规范

    Go语言学习技巧之命名规范

    最近在学习go语言,发现了不少需要整理的知识点,所以整理下分享出来,下面这篇文章主要给大家介绍了关于Go语言学习技巧之命名规范的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • 关于golang 字符串 int uint int64 uint64 互转问题

    关于golang 字符串 int uint int64 uint64&

    这篇文章主要介绍了golang 字符串 int uint int64 uint64 互转,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 详解Go语言如何实现类似Python中的with上下文管理器

    详解Go语言如何实现类似Python中的with上下文管理器

    熟悉 Python 的同学应该知道 Python 中的上下文管理器非常好用,那么在 Go 中是否也能实现上下文管理器呢,下面小编就来和大家仔细讲讲吧
    2023-07-07
  • go语言中GoMock安装使用详解

    go语言中GoMock安装使用详解

    这篇文章主要为大家介绍了go语言中GoMock安装使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Go中的new()和make()函数区别及底层原理详解

    Go中的new()和make()函数区别及底层原理详解

    这篇文章主要为大家介绍了Go中的new()和make()函数区别及底层原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 深入Go goroutine理解

    深入Go goroutine理解

    这篇文章主要介绍了深入Go goroutine理解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Go语言开发区块链只需180行代码(推荐)

    Go语言开发区块链只需180行代码(推荐)

    这篇文章主要介绍了Go语言开发区块链只需180行代码,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法。需要的朋友可以参考下
    2018-05-05
  • gRPC中拦截器的使用详解

    gRPC中拦截器的使用详解

    这篇文章主要介绍了gRPC中拦截器的使用详解,本次主要介绍在gRPC中使用拦截器,包括一元拦截器和流式拦截器,在拦截器中添加JWT认证,客户端登录之后会获得token,请求特定的API时候需要带上token才能访问,需要的朋友可以参考下
    2023-10-10
  • Golang中ringbuffer的实现与应用场景详解

    Golang中ringbuffer的实现与应用场景详解

    ringbuffer因为它能复用缓冲空间,通常用于网络通信连接的读写,虽然市面上已经有了go写的诸多版本的ringbuffer组件,但还是自己造一个吧
    2023-06-06
  • 浅谈Go连接池的设计与实现

    浅谈Go连接池的设计与实现

    本文主要介绍了浅谈Go连接池的设计与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论