欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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對象的內存空間有棧、堆、方法區(qū)、靜態(tài)區(qū)。

第 3 - 5 行返回的是 pre suf 兩個變量的地址,每一次調用是pre suf 地址都是不變的。

第 6 - 9 行這是新聲明的 f1 變量,這時候 pre suf 的地址和上一次 f 的里面的 pre suf 地址是不一樣的。

因為我們創(chuàng)建引用類型的變量時,其實只是一個標頭值,標頭值里包含一個指針,指針指向底層的數據,它所指向的底層結構沒有被復制傳遞,這也引用類型比值類型傳遞更高效的原因。

以上就是Go語言基礎閉包的底層原理及實例詳解的詳細內容,更多關于Go語言閉包的資料請關注腳本之家其它相關文章!

相關文章

  • 詳解Golang中errors包如何返回自定義error類型

    詳解Golang中errors包如何返回自定義error類型

    這篇文章主要為大家詳細介紹了Golang中errors包如何返回自定義error類型,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • go mayfly開源項目代碼結構設計

    go mayfly開源項目代碼結構設計

    這篇文章主要為大家介紹了go mayfly開源項目代碼結構設計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Golang 字符串與字節(jié)數組互轉的實現

    Golang 字符串與字節(jié)數組互轉的實現

    在Go語言中,我們經常在字符串和切片之間進行轉換,本文就詳細的介紹一下Golang 字符串與字節(jié)數組互轉的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 如何避免Go語言常見錯誤之意外的變量隱藏

    如何避免Go語言常見錯誤之意外的變量隱藏

    在Go語言中,變量隱藏(Variable Shadowing)是一個常見的錯誤來源,變量隱藏發(fā)生在一個內部作用域中聲明的變量與外部作用域的變量同名時,這可能導致開發(fā)者無意中使用了錯誤的變量,造成難以追蹤的bug,本文講解一些關于變量隱藏的常見錯誤和如何避免它們的方法
    2024-01-01
  • Go語言中三種不同md5計算方式的性能比較

    Go語言中三種不同md5計算方式的性能比較

    md5計算在我們日常工作的時候經常能遇到,下面這篇文章主要介紹了Go語言中三種不同md5計算方式的性能比較,需要的朋友可以參考借鑒,下面來一起學習學習吧。
    2017-01-01
  • win10下go mod配置方式

    win10下go mod配置方式

    這篇文章主要介紹了win10下go mod配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • golang strings包的Replace的使用說明

    golang strings包的Replace的使用說明

    這篇文章主要介紹了golang strings包的Replace的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 在Golang中執(zhí)行Shell命令的教程詳解

    在Golang中執(zhí)行Shell命令的教程詳解

    在本教程中,我們將學習如何在 Golang 中執(zhí)行shell命令(如 ls、mkdir 或 grep ),我們還將學習如何通過 stdin 和 stdout 傳遞 I/O 到正在運行的命令,以及管理長時間運行的命令,感興趣的同學可以借鑒一下
    2023-05-05
  • Golang設計模式之適配器模式詳細講解

    Golang設計模式之適配器模式詳細講解

    這篇文章主要介紹了使用go實現適配器模式,這個模式就是用來做適配的,它將不兼容的接口轉換為可兼容的接口,讓原本由于接口不兼容而不能一起工作的類可以一起工作,需要的朋友可以參考下
    2023-01-01
  • 深入了解Go語言中的作用域和變量重聲明

    深入了解Go語言中的作用域和變量重聲明

    在?Go?語言中,代碼塊的嵌套和作用域是程序設計的關鍵概念之一,本文將探討如何在?Go?語言中利用代碼塊的嵌套和作用域來組織代碼,并介紹變量重聲明的規(guī)則,感興趣的可以了解下
    2023-11-11

最新評論