久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

Go 語言中的閉包

本文主要介紹 Go 語言中的閉包。簡單的說 Go 語言的閉包就是一個引用了外部自由變量匿名函數,被引用的自由變量和該匿名函數共同存在,不會因為離開了外部環境就被釋放或者刪除,還可以在這個匿名函數中繼續使用。

 

1. Go 語言的匿名函數

在上文中我們了解到了一個新的詞匯——匿名函數,我們先來學習一下Go語言中的匿名函數,再來了解在 Go 語言中如何使用閉包。匿名函數,顧名思義,就是隱藏函數名的函數。

代碼示例

代碼塊
  • 1? package main
  • 2
  • 3? import (
  • 4? ? ? ? ? "fmt"
  • 5? )
  • 6
  • 7? var f = func() {
  • 8? ? ? ? ? fmt.Println("匿名函數作為變量來使用")
  • 9? }
  • 10
  • 11? func main() {
  • 12? ? ? ? ? f()
  • 13
  • 14? ? ? ? ?? func(){
  • 15? ? ? ? ? ? ? ? ? fmt.Println("匿名函數直接使用")
  • 16? ? ? ? ? }()
  • 17? }
  • 第7~9行:定義一個函數類型,值為一個匿名函數的變量;
  • 第 12 行:使用這個匿名函數;
  • 第 14~16 行:定義一個匿名函數。在這個函數后加上(),就可以直接使用這個匿名函數。

執行結果

圖片描述

 

2. 匿名函數引用外部變量

如果在匿名函數內,使用了外部環境的變量,就構成了一個閉包。簡單來講就是一個函數內,使用匿名函數來操作函數內聲明的變量。

代碼示例

代碼塊
  • 1? package main
  • 2
  • 3? import (
  • 4? ? ? ? ? "fmt"
  • 5? )
  • 6
  • 7? func main() {
  • 8? ? ? ? ? str := "Hello World!"
  • 9? ? ? ? ? func() {
  • 10? ? ? ? ? ? ? ? str = "Hello Codey!"
  • 11? ? ? ? }()
  • 12? ? ? ? fmt.Println(str)
  • 13? }
  • 第 10 行:匿名函數直接操作了main函數之中的變量str,將其修改為了"Hello Codey!";
  • 第 12 行:輸出變量的值。

執行結果

圖片描述

上述例子簡單的構造了一個閉包,在匿名函數中并沒有聲明或者定義str這個變量,但是可以直接操作,就是引用可main函數中的自由變量。這個例子可能對自由變量的引用表現不是很直觀,我們接下來使用defer和閉包相結合,深入了解一下閉包中的引用外部變量。

代碼示例

代碼塊
  • 1? package main
  • 2
  • 3? import (
  • 4? ? ? ? ? "fmt"
  • 5? )
  • 6
  • 7? func main() {
  • 8? ? ? ? ? str := "Hello World!"
  • 9? ? ? ? ? defer func() {
  • 10? ? ? ? ? ? ? ? fmt.Println("defer str=", str)
  • 11? ? ? ? }()
  • 12? ? ? ? str = "Hello Codey!"
  • 13? ? ? ? fmt.Println("main str=", str)
  • 14? }

執行結果

圖片描述

從執行結果上來看應該是蠻出人意料的,因為前文介紹 defer 的時候明確介紹了 defer 后變量是保留它在 defer 時的值,而不會被 defer 之后的代碼所改變。但是在閉包這邊這個看起來不太適用,其實是適用的,只是閉包是引用了這個變量,也就是說,在 defer 時被保留下來的是這個變量的地址,后續代碼改變的不是地址,而是這個地址存儲的值,所以后續代碼對這個變量的操作,都會反應到這個 defer 中。

Tips:關于變量的地址,在后續的Go語言的指針中會有詳細的介紹。

 

3. 小結

本文主要介紹了 Go 語言中閉包的使用,需要注意以下幾點:

  • 閉包就是匿名函數引用外部變量
  • 閉包中引用的變量會被外部環境改變,同時閉包內對變量的改變也會影響到外部環境的使

文章來源于網絡,侵刪!

相關新聞

歷經多年發展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發專業人才培訓機構!

    1. 主站蜘蛛池模板: 亚东县| 洱源县| 万载县| 通河县| 喀什市| 新巴尔虎右旗| 盈江县| 县级市| 德令哈市| 额敏县| 高要市| 论坛| 陇西县| 水城县| 乌拉特中旗| 邳州市| 华蓥市| 盖州市| 松阳县| 三穗县| 宁南县| 洛南县| 晴隆县| 元阳县| 沙坪坝区| 晋城| 彩票| 特克斯县| 高雄县| 荔浦县| 绥中县| 华宁县| 仙居县| 麦盖提县| 榕江县| 洮南市| 莒南县| 黄龙县| 锡林浩特市| 定安县| 湘乡市|