<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                在程序?`function_return.go`?中我們將會看到函數 Add2 和 Adder 均會返回簽名為?`func(b int) int`?的函數: ~~~ func Add2() (func(b int) int) func Adder(a int) (func(b int) int) ~~~ 函數 Add2 不接受任何參數,但函數 Adder 接受一個 int 類型的整數作為參數。 我們也可以將 Adder 返回的函數存到變量中(function_return.go)。 ~~~ package main import "fmt" func main() { // make an Add2 function, give it a name p2, and call it: p2 := Add2() fmt.Printf("Call Add2 for 3 gives: %v\n", p2(3)) // make a special Adder function, a gets value 3: TwoAdder := Adder(2) fmt.Printf("The result is: %v\n", TwoAdder(3)) } func Add2() func(b int) int { return func(b int) int { return b + 2 } } func Adder(a int) func(b int) int { return func(b int) int { return a + b } } ~~~ 輸出: ~~~ Call Add2 for 3 gives: 5 The result is: 5 ~~~ 下例為一個略微不同的實現(function_closure.go): ~~~ package main import "fmt" func main() { var f = Adder() fmt.Print(f(1), " - ") fmt.Print(f(20), " - ") fmt.Print(f(300)) } func Adder() func(int) int { var x int return func(delta int) int { x += delta return x } } ~~~ 函數 Adder() 現在被賦值到變量 f 中(類型為?`func(int) int`)。 輸出: ~~~ 1 - 21 - 321 ~~~ 三次調用函數 f 的過程中函數 Adder() 中變量 delta 的值分別為:1、20 和 300。 我們可以看到,在多次調用中,變量 x 的值是被保留的,即?`0 + 1 = 1`,然后?`1 + 20 = 21`,最后?`21 + 300 = 321`:閉包函數保存并積累其中的變量的值,不管外部函數退出與否,它都能夠繼續操作外部函數中的局部變量。 這些局部變量同樣可以是參數,例如之前例子中的?`Adder(as int)`。 這些例子清楚地展示了如何在 Go 語言中使用閉包。 在閉包中使用到的變量可以是在閉包函數體內聲明的,也可以是在外部函數聲明的: ~~~ var g int go func(i int) { s := 0 for j := 0; j < i; j++ { s += j } g = s }(1000) // Passes argument 1000 to the function literal. ~~~ 這樣閉包函數就能夠被應用到整個集合的元素上,并修改它們的值。然后這些變量就可以用于表示或計算全局或平均值。 **練習 6.9**?不使用遞歸但使用閉包改寫第 6.6 節中的斐波那契數列程序。 **練習 6.10** 學習并理解以下程序的工作原理: 一個返回值為另一個函數的函數可以被稱之為工廠函數,這在您需要創建一系列相似的函數的時候非常有用:書寫一個工廠函數而不是針對每種情況都書寫一個函數。下面的函數演示了如何動態返回追加后綴的函數: ~~~ func MakeAddSuffix(suffix string) func(string) string { return func(name string) string { if !strings.HasSuffix(name, suffix) { return name + suffix } return name } } ~~~ 現在,我們可以生成如下函數: ~~~ addBmp := MakeAddSuffix(“.bmp”) addJpeg := MakeAddSuffix(“.jpeg”) ~~~ 然后調用它們: ~~~ addBmp("file") // returns: file.bmp addJpeg("file") // returns: file.jpeg ~~~ 可以返回其它函數的函數和接受其它函數作為參數的函數均被稱之為高階函數,是函數式語言的特點。我們已經在第 6.7 中得知函數也是一種值,因此很顯然 Go 語言具有一些函數式語言的特性。閉包在 Go 語言中非常常見,常用于 goroutine 和管道操作(詳見第 14.8-14.9 節)。在第 11.14 節的程序中,我們將會看到 Go 語言中的函數在處理混合對象時的強大能力。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看