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

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

在函數(shù)內(nèi)部定義函數(shù)

在函數(shù)內(nèi)部定義函數(shù)

Go
忽然笑 2023-06-19 15:54:35
在定義一個(gè)使用外部作用域變量的內(nèi)部函數(shù)時(shí),我應(yīng)該將變量作為參數(shù)傳遞給內(nèi)部函數(shù)嗎?在我的示例中,generate 和 generate2 都給我相同的結(jié)果,我是否應(yīng)該選擇其中任何一個(gè)?該代碼選擇鍵 1 以生成與鍵 3、4、5 的組合,然后選擇鍵 2 以生成與鍵 3、4、5 的組合。package mainimport (    "fmt")func main() {    fmt.Println("Hello, playground")    src := map[int][]string{        1: []string{"1", "11", "111"},        2: []string{"2", "22"},        3: []string{"3"},        4: []string{"4"},        5: []string{"5", "55"},    }    result2 := generate2(src)    fmt.Println(result2)    result := generate(src)    fmt.Println(result)}func generate(src map[int][]string) []string {    var combo []string    var add = func(f []string) {        for _, v := range f {            for _, p := range src[3] {                for _, q := range src[4] {                    for _, r := range src[5] {                        combo = append(combo, v+p+q+r)                    }                }            }        }    }    add(src[1])    add(src[2])    return combo}func generate2(src map[int][]string) []string {    var combo []string    var add = func(f []string, combo []string, src map[int][]string) []string {        for _, v := range f {            for _, p := range src[3] {                for _, q := range src[4] {                    for _, r := range src[5] {                        combo = append(combo, v+p+q+r)                    }                }            }        }        return combo    }    combo = add(src[1], combo, src)    combo = add(src[2], combo, src)    return combo}
查看完整描述

2 回答

?
楊魅力

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

在定義一個(gè)使用外部作用域變量的內(nèi)部函數(shù)時(shí),我應(yīng)該將變量作為參數(shù)傳遞給內(nèi)部函數(shù)嗎?


這取決于你想要達(dá)到的目標(biāo)。


你所說(shuō)的“函數(shù)內(nèi)的函數(shù)”實(shí)際上被稱為“閉包”(有些人稱之為“l(fā)ambda”)。


閉包從外部詞法范圍捕獲變量,在其主體中引用。在 Go 中,這種捕獲是“通過(guò)引用”或“通過(guò)名稱”完成的,這基本上意味著每次調(diào)用閉包時(shí),它都會(huì)“看到”它關(guān)閉的變量的當(dāng)前值,而不是這些變量在關(guān)閉時(shí)的值被創(chuàng)建——觀察程序:


package main


import (

    "fmt"

)


func main() {

    i := 42


    fn := func() {

      fmt.Println(i)

    }


    fn()

    i = 12

    fn()

}

會(huì)輸出


42

12

相反,當(dāng)您將值作為參數(shù)傳遞給閉包調(diào)用時(shí),每次調(diào)用都會(huì)準(zhǔn)確地看到傳遞給它的值。


我希望你現(xiàn)在明白選擇什么策略在很大程度上取決于你想要什么。


從概念上講,您可能將閉包視為臨時(shí)匿名struct數(shù)據(jù)類型的實(shí)例,其字段是指向閉包關(guān)閉的變量的指針,并且每次對(duì)該閉包的調(diào)用都類似于調(diào)用一些(匿名的,唯一的) ) 該類型提供的方法(實(shí)際上,這就是編譯器通常在你背后做的來(lái)實(shí)現(xiàn)閉包)。這樣的“方法”可能有參數(shù),它是否應(yīng)該有參數(shù),什么應(yīng)該進(jìn)入類型的字段以及該方法的參數(shù)應(yīng)該是什么,可以使用您對(duì)常規(guī)類型采用的常用方法來(lái)判斷。


查看完整回答
反對(duì) 回復(fù) 2023-06-19
?
慕斯709654

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

在這種情況下,這兩個(gè)功能之間沒(méi)有功能差異。正如您所注意到的,局部函數(shù)可以訪問(wèn)局部變量而無(wú)需顯式傳遞它們。在您的示例中,您可能更喜歡使用 generate1 以便于閱讀。



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

添加回答

舉報(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)