第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang 在編寫函數(shù)閉包時(shí)會(huì)自動(dòng)將變量分配為參數(shù)嗎?

Golang 在編寫函數(shù)閉包時(shí)會(huì)自動(dòng)將變量分配為參數(shù)嗎?

Go
湖上湖 2023-07-10 17:55:02
這是我引用的代碼:package mainimport "fmt"func adder() func(int) int {    sum := 0    return func(x int) int {        sum += x        return sum    }}func main() {    pos, neg := adder(), adder()    for i := 0; i < 10; i++ {        fmt.Println(            pos(i),            neg(-2*i),        )    }}以下是運(yùn)行時(shí)的輸出:    0 0    1 -2    3 -6    6 -12    10 -20    15 -30    21 -42    28 -56    36 -72    45 -90我不明白函數(shù)中的語(yǔ)句x是如何分配的?它似乎沒(méi)有在函數(shù)中的任何地方傳遞。我也不明白這個(gè)變量是如何工作的。每次調(diào)用該函數(shù)并為其賦值時(shí),不應(yīng)該重置它嗎?returnaddersumadder0
查看完整描述

2 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

Go 以非常典型/標(biāo)準(zhǔn)的方式處理一流的函數(shù)和閉包。在這種情況下,調(diào)用adder自身:

  1. 創(chuàng)建以 valueint命名的對(duì)象。sum0

  2. 返回一個(gè)閉包:一個(gè)類似函數(shù)的東西1,當(dāng)被調(diào)用時(shí),可以訪問(wèn)變量sum。

返回的特定類似函數(shù)的東西adder(其調(diào)用者在普通變量中捕獲)是一個(gè)帶有一個(gè)參數(shù)的函數(shù)。然后你調(diào)用它,傳遞一個(gè)參數(shù)。這種參數(shù)傳遞沒(méi)有什么特別之處:它的工作方式與其他地方相同。在類似函數(shù)的東西中,使用變量x可以獲取調(diào)用者傳遞的值。使用名稱sum可以獲取捕獲的int對(duì)象,無(wú)論其值是什么。從函數(shù)返回后,捕獲的內(nèi)容int仍然被捕獲,因此稍后調(diào)用相同的類似函數(shù)的東西會(huì)看到int中的更新sum。

通過(guò)調(diào)用adder兩次,您會(huì)得到兩個(gè)略有不同的類似函數(shù)的東西:每個(gè)都有自己的私有sum.?這兩個(gè) privatesum最初都為零。調(diào)用您保存了值的類似函數(shù)的東西pos可以獲得使用其中之一的函數(shù)。調(diào)用稍微不同的類似函數(shù)的東西,你保存了它的值,neg你就可以得到使用另一個(gè)函數(shù)的函數(shù)。


1這個(gè)“類似函數(shù)的東西”和實(shí)際的函數(shù)之間沒(méi)有真正的區(qū)別,只是這個(gè)特定的類似函數(shù)的東西沒(méi)有可以調(diào)用它的名稱。這或多或少就是擁有一流功能的含義。


如果您遇到可讀性問(wèn)題......

其原始形式是:

func adder() func(int) int {

? ? sum := 0

? ? return func(x int) int {

? ? ? ? sum += x

? ? ? ? return sum

? ? }

}

讓我們用一些類型名稱和其他語(yǔ)法更改來(lái)重寫它,使代碼的核心保持不變。首先,讓我們起一個(gè)名字,意思是func(int) int:


type adderClosure func(int) int

然后我們可以用它來(lái)重寫adder第一行:


func adder() adderClosure {

? ? ...

}

現(xiàn)在讓我們?cè)诩臃ㄆ髦袆?chuàng)建一個(gè)局部變量來(lái)保存我們要返回的函數(shù)。為了明確和冗余,我們可以再次使用這種類型:


? ? var ret adderClosure // not good style: just for illustration

現(xiàn)在讓我們通過(guò)執(zhí)行以下操作將該變量分配給我們的閉包:


? ? sum := 0

? ? ret = func(x int) int {

? ? ? ? sum += x

? ? ? ? return sum

? ? }

然后我們可以return ret返回閉包。?這是 Go Playground 上的完整代碼。


查看完整回答
反對(duì) 回復(fù) 2023-07-10
?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

當(dāng)您分配和時(shí),該sum變量位于兩個(gè)閉包中。閉包中的是通過(guò)添加 1, 2, 3, 4(斐波那契風(fēng)格)來(lái)更新的,而閉包中的是通過(guò)在每次循環(huán)迭代中減去 2*1, 2*2, 2*3, 2*4 來(lái)更新的。posnegsumpossumneg


或者,更詳細(xì)地說(shuō): pos := adder()分配給一個(gè)函數(shù),該函數(shù)具有從0 開始的pos閉包。然后每當(dāng)您調(diào)用該函數(shù)時(shí),它都會(huì)相應(yīng)更新。和任何其他類似的作業(yè)也是如此。sumsumpossumneg


以下是一些類似(更簡(jiǎn)單)的 JavaScript 代碼,可在瀏覽器控制臺(tái)中運(yùn)行:


function adder() {

? var sum = 0;

? return function(i) {

? ? sum += i;

? ? return sum;

? }

}


var pos = adder();

console.log( pos(1) ); // add 1 to 0 (1)

console.log( pos(2) ); // add 2 to 1 (3)

console.log( pos(3) ); // add 3 to 3 (6)

console.log( pos(4) ); // add 4 to 6 (10)

查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 2 回答
  • 0 關(guān)注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)