首頁  >  文章  >  後端開發  >  為什麼我不能取得 golang 中函數的位址,但可以取得函數值

為什麼我不能取得 golang 中函數的位址,但可以取得函數值

WBOY
WBOY轉載
2024-02-10 19:30:20777瀏覽

为什么我不能获取 golang 中函数的地址,但可以获取函数值

php小編子墨為您解答:為什麼我不能取得 golang 中函數的位址,但可以取得函數值?在Golang中,函數值是可以被取得的,因為函數值是可以被呼叫的型別。而函數的位址則是不可取得的,這是由Golang的設計決策所決定的。 Golang中的函數是一等公民,可以像其他類型一樣被賦值、傳遞和呼叫。因此,函數值可以被獲取,也可以傳遞給其他函數。但是,Golang的函數實作是透過閉包來實現的,每次建立函數時都會產生一個新的閉包實例,所以函數的位址是不固定的,無法被取得。這樣的設計可以確保函數的獨立性和安全性,同時簡化了記憶體管理和垃圾回收的過程。所以,雖然不能取得函數的位址,但可以取得函數值並進行呼叫。

問題內容

假設我在 golang 中宣告了一個函數:

func myfunc() {     
    }

宣告使用函數位址的函數指標是錯誤的

fp := &myfunc

「無效操作:無法取得 myfunc 的位址(func() 類型的值)」

但是,我可以將它指派給函數值並取得位址

functionValue := myFunc
fp := &function

「functionvalue」與使用函數名稱「myfunc」有什麼不同嗎? 他們兩個不是同一類型嗎? (函數())

解決方法

myfunc 是一個函數。 functionvalue是一個函數變量,它是一個指向函數的變量,也是一個閉包。例如:

var x int
functionValue:=func() int {return x}

上面,functionvalue 是一個函數變量,其閉包包含對 x 的參考。

像是 myfunc 這樣的命名函數沒有與之關聯的閉包。像 functionvalue 這樣的函數變數有一個閉包。當您將其指派給 myfunc 時,該閉包為空。當您像上面那樣分配它時,它是非空的。因此,呼叫函數的機制與呼叫函數變數不同。

函數變數的位址就是該變數的位址。

以上是為什麼我不能取得 golang 中函數的位址,但可以取得函數值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除