最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Go語(yǔ)言中閉包的使用

 更新時(shí)間:2022年12月06日 16:06:11   作者:甜點(diǎn)cc  
閉包是一個(gè)函數(shù)和其相關(guān)的引用環(huán)境組合的一個(gè)整體。本文主要為大家介紹一下Go語(yǔ)言中閉包的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定幫助,需要的可以參考一下

閉包基本介紹

閉包就是 一個(gè)函數(shù) 和其相關(guān)的 引用環(huán)境 組合的一個(gè)整體

好處: 保存引用的變量,下次繼續(xù)使用,不會(huì)銷毀

下面通過(guò)閉包的方式,寫(xiě)一個(gè)數(shù)字累加器,體驗(yàn)一下閉包的妙處

閉包實(shí)現(xiàn)數(shù)字累加

package main

import "fmt"

// 累加器
// 閉包 - 函數(shù)柯里化
// 返回值類型: 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
}

代碼說(shuō)明

1.AddUpper是一個(gè)函數(shù),返回的數(shù)據(jù)類型 func(int) int

2.閉包的說(shuō)明

返回的是一個(gè)匿名函數(shù),但是這個(gè)匿名函數(shù)引用到了函數(shù)外的變量 n ,因此這個(gè)匿名函數(shù)就和 n 形成一個(gè)整體,構(gòu)成閉包

3.當(dāng)反復(fù)調(diào)用 f 函數(shù)時(shí),因?yàn)?n 只初始化一次,保存了變量的值,因此每調(diào)用一次就相當(dāng)于進(jìn)行了累加。

4.我們要搞清楚閉包,關(guān)鍵就是要分析返回的函數(shù)使用到哪些變量

代碼分析

這里我引入了一個(gè)字符串變量str,來(lái)幫助分析閉包是怎么保存變量的。

package main

import (
	"fmt"
)

// 累加器
// 閉包 - 函數(shù)柯里化
// 返回值類型: 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

從輸出可以看出來(lái),閉包引用的變量nstr并沒(méi)有在調(diào)用函數(shù)的時(shí)候重復(fù)聲明,而是保留了下次函數(shù)調(diào)用后更新的值。

閉包案例

需求:

  • 編寫(xiě)一個(gè)函數(shù) makeSuffix(suffix string) ,可以接收一個(gè)文件后綴名,并返回一個(gè)閉包
  • 調(diào)用閉包,可以傳入一個(gè)文件名,如果該文件名沒(méi)有指定后綴,則返回 文件名.jpg ,如果已經(jīng)有.jpg,則返回原文件名。

strings.HasSuffix,該函數(shù)可以判斷某個(gè)字符串是否有指定的后綴。

上代碼

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
	}
}

// 傳統(tǒng)寫(xiě)法
func makeSuffixV2(suffix string, name string) string {
	if !strings.HasSuffix(name, suffix) {
		return name + suffix
	}
	return name
}

func main() {
	// 閉包調(diào)用
	f := makeSuffix(".jpg")
	fmt.Println(f("xiao"))         // xiao.jpg
	fmt.Println(f("xiaoxiao.jpg")) // xiaoxiao.jpg
	fmt.Println(f("xiaoxiao.666")) // xiaoxiao.666.jpg

	// 傳統(tǒng)寫(xiě)法調(diào)用
	fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "allblue"))  // makeSuffixV2= allblue.jpg
	fmt.Println("makeSuffixV2=", makeSuffixV2(".jpg", "all.blue")) // makeSuffixV2= all.blue.jpg
}

代碼說(shuō)明

返回的匿名函數(shù)和 makeSuffix(suffix string) 的 suffix 變量組合成一個(gè)閉包

傳統(tǒng)寫(xiě)法和閉包寫(xiě)法實(shí)現(xiàn)效果一樣,但是,傳統(tǒng)寫(xiě)法需要重復(fù)寫(xiě)變量, 比如上面的

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

閉包則解決了這個(gè)問(wèn)題,是代碼看起來(lái)更加的簡(jiǎn)潔

閉包的好處之一: 參數(shù)復(fù)用

好處: 保存引用的變量,下次繼續(xù)使用,不會(huì)銷毀

到此這篇關(guān)于淺析Go語(yǔ)言中閉包的使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言閉包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO中sync包自由控制并發(fā)示例詳解

    GO中sync包自由控制并發(fā)示例詳解

    這篇文章主要為大家介紹了GO中sync包自由控制并發(fā)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • GoLang中Module的基本使用方法

    GoLang中Module的基本使用方法

    Go module是從Go 1.11版本才引入的新功能,下面這篇文章主要給大家介紹了關(guān)于GoLang中Module的基本使用方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • GO 語(yǔ)言學(xué)習(xí)指南

    GO 語(yǔ)言學(xué)習(xí)指南

    這篇文章主要介紹了GO 語(yǔ)言學(xué)習(xí)指南,介紹的相當(dāng)全面,有需要的小伙伴參考下吧。
    2015-01-01
  • Go使用Viper庫(kù)讀取YAML配置文件的示例代碼

    Go使用Viper庫(kù)讀取YAML配置文件的示例代碼

    Viper是適用于Go應(yīng)用程序的完整配置解決方案,它被設(shè)計(jì)用于在應(yīng)用程序中工作,并且可以處理所有類型的配置需求和格式,本文給大家介紹了Go使用Viper庫(kù)讀取YAML配置文件的方法,需要的朋友可以參考下
    2024-05-05
  • Go語(yǔ)言依賴管理三要素示例解析

    Go語(yǔ)言依賴管理三要素示例解析

    這篇文章主要介紹了Go語(yǔ)言依賴管理三要素及示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 深入Golang中的sync.Pool詳解

    深入Golang中的sync.Pool詳解

    這篇文章主要介紹了深入Golang中的sync.Pool詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Golang設(shè)計(jì)模式之原型模式詳細(xì)講解

    Golang設(shè)計(jì)模式之原型模式詳細(xì)講解

    如果一個(gè)類的有非常多的屬性,層級(jí)還很深。每次構(gòu)造起來(lái),不管是直接構(gòu)造還是用建造者模式,都要對(duì)太多屬性進(jìn)行復(fù)制,那么有沒(méi)有一種好的方式讓我們創(chuàng)建太的時(shí)候使用體驗(yàn)更好一點(diǎn)呢? 今天的文章里就給大家介紹一種設(shè)計(jì)模式,來(lái)解決這個(gè)問(wèn)題
    2023-01-01
  • golang中如何使用kafka方法實(shí)例探究

    golang中如何使用kafka方法實(shí)例探究

    Kafka是一種備受歡迎的流處理平臺(tái),具備分布式、可擴(kuò)展、高性能和可靠的特點(diǎn),在處理Kafka數(shù)據(jù)時(shí),有多種最佳實(shí)踐可用來(lái)確保高效和可靠的處理,這篇文章將介紹golang中如何使用kafka方法
    2024-01-01
  • Go 內(nèi)存分配管理

    Go 內(nèi)存分配管理

    這篇文章主要介紹了Go 內(nèi)存分配管理,go 語(yǔ)言實(shí)際內(nèi)存、虛擬內(nèi)存怎么分配,延遲歸還是什么機(jī)制?本文結(jié)合監(jiān)控對(duì)內(nèi)存管理進(jìn)行了觀測(cè),深入學(xué)習(xí)golang對(duì)于內(nèi)存的管理機(jī)制,需要的朋友可以參考一下
    2022-02-02
  • Go Slice擴(kuò)容的這些坑你踩過(guò)哪些

    Go Slice擴(kuò)容的這些坑你踩過(guò)哪些

    這篇文章主要為大家詳細(xì)介紹了Golang中對(duì)切片Slice的append操作時(shí)會(huì)遇到的踩坑經(jīng)驗(yàn)分享,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-03-03

最新評(píng)論

柘城县| 远安县| 综艺| 静安区| 柞水县| 溧阳市| 云安县| 南雄市| 武汉市| 邹平县| 临安市| 泉州市| 玉环县| 浦县| 克东县| 伊宁县| 册亨县| 托克托县| 香河县| 上犹县| 新平| 祁阳县| 泽州县| 卢氏县| 威信县| 桦川县| 葫芦岛市| 察雅县| 咸宁市| 灌阳县| 都匀市| 江北区| 绵竹市| 聂拉木县| 渭南市| 晋宁县| 南昌县| 唐海县| 利辛县| 胶南市| 西丰县|