封閉所容納的環境範圍是什麼?
php小編魚仔封閉所容納的環境範圍是指封閉環境中所包含的元素、因素和條件。封閉環境是指一個相對封閉、受限的空間或範圍,可以是實體空間,如實驗室、工廠車間, 也可以是虛擬空間,如電腦網路。在封閉環境中,各種因素如溫度、濕度、氣體組成等都可以被控制和調節,以達到特定的目的。封閉環境常見於科學研究實驗、生產製造等領域,對於確保實驗精確度、產品品質等方面扮演重要角色。
問題內容
我模仿網路上關於閉包的教程,寫了下面的程式碼。
func foo1() func() { xvalue := 1 x := &xvalue defer func() { xvalue = 2 }() return func() { *x = *x + 1 fmt.printf("foo1 val = %d\n", *x) } } func main() { f1 := foo1() f1() f1() f1() }
我很困惑,在執行f1 := foo1()
後,變數xvalue
似乎應該被回收,因此使用*x
應該是錯誤的,但上面的程式碼沒有錯誤並且執行罰款,給出輸出
foo1 val = 3 foo1 val = 4 foo1 val = 5
所以我想知道閉包除了保存指標本身之外還保存了指標的值還是go語言的垃圾回收機制導致xvalue沒有被刪除?
解決方法
在 Go 中,閉包取得對其關閉的任何變數(的位址)的參考。引用語言參考:
函數文字是閉包:它們可以引用周圍函數中定義的變數。然後,這些變數在周圍的函數和函數文字之間共享,並且只要可訪問,它們就會一直存在。
因此,在您的範例中:
-
f1 := foo1()
- #使
xValue
變數存在(編譯器可能會在堆上分配它)。它將以其類型的零值 0 開始。 - 使變數
x
存在並為其指派xValue
的位址。 -
defer
-red 閉包運行並將值 2 指派給xValue
。 - 傳回一個關閉變數
x
的閉包。
後一點可能有點棘手:由於返回的閉包引用了變數
x
,編譯器保證即使在foo
返回後該變數也存在。由於x
包含xValue
的位址(因此是對它的即時引用),因此該位址仍然存在,並且不能被垃圾收集。 使用相同的轉義分析方法,編譯器保證xValue
在其宣告的函數傳回後仍然存在。 - #使
-
您執行傳回的閉包,該閉包透過指向它的指標來修改
xValue
# – 這裡沒有發生任何魔法。另外兩個調用執行相同的操作。
總而言之,也許您被C 知識絆倒了,一旦從該函數返回控制權,函數中聲明的任何變數都將不再存在,因此該函數外部存在的對該變數的任何引用都將變為無效的。在Go 中,情況並非如此:在這方面,語言被明確定義為安全:編譯器確保任何變數都有適當的分配,以便在返回(或以其他方式傳達)對它的引用時在創建它的函數呼叫中存活下來。從該函數呼叫到外部世界。
以上是封閉所容納的環境範圍是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...
