一篇文章帶你瞭解Go語言基礎之函數(下篇)

點擊上方「 Go語言進階學習 」,進行關注

回覆「Go語言」便可獲贈Python從入門到進階共10本電子書web

swift

微信

閉包

app

吾觀自古賢達人,功成不退皆殞身。

前言

Hey,你們好呀,我是星期八,此次我們來學習一下函數的最後一些知識,快來上車叭。以前已經分享了:一篇文章帶你瞭解Go語言基礎之函數(上篇)一篇文章帶你瞭解Go語言基礎之函數(中篇),沒遇上車的小夥伴去看看吧。less


上次主要回顧

上述咱們知道,定義一個函數,能夠將函數內存分配理解以下。編輯器

同時咱們也知道,不管進行什麼操做,只會操做上面的
ide


函數和變量

函數名即變量

不知道你想過沒,定義一個變量,接收一個函數,就像這樣。函數

package main
import "fmt"
func say() { fmt.Println("say")}
func main() { var s1 = say s1()}

執行結果以下。
學習

能夠發現,經過一個變量接收一個函數名,在經過變量名+括號執行,是沒有問題的。

那麼,這個變量是什麼類型的呢???

fmt.Printf("%T\n",s1)

執行結果

若是我將say函數改一下呢?

func say(s int) int{ fmt.Println("say") return 1}
fmt.Printf("%T\n",s1)

能夠發現,若是函數參數返回值不同,打印出來的類型也是不同的。

定義函數類型

上述咱們知道,能夠經過變量接收一個函數名

經過變量接收函數名沒有約束的,無論函數幾個參數,幾個返回值,均可以接收,真是活出了動態語言的樣子。

定義函數類型就是限制變量接收函數,只能接收指定格式函數

主要用到type關鍵字。

格式

type 變量名 func([參數類型,參數類型]) [返回值類型]中括號表示可選參數

例如

type a func()type b func(int)type a func(int,int) int

具體代碼

package main
import "fmt"
/* 定義一個函數類型的變量 接收的函數參數必須是兩個int類型 函數的返回值也必須是int類型*/type cType func(intint) int
func say1(a, b int) int { fmt.Println("say",a+b) return 1}func say2(a, b int) { fmt.Println("say")
}func main() { var s1 cType s1 = say1//調用s1其實調用的就是say1 s1(11)
//var s2 cType //s2 = say2//報錯,cannot use say2 (type func(int, int)) as type cType in assignment}

高階函數

千萬不要被這個名字唬住了。

簡單點說,高階函數就是把函數看成參數或者把函數看成返回值

函數看成參數

package main
import "fmt"
func add(x int, y int) int { return x + y}func calc(x int, y int, other func(intint) int) int { return other(x, y)}func main() { //將add函數傳入第三個參數 var result = calc(3412, add) fmt.Println(result)}

函數看成返回值

package main
import "fmt"
func add(x int, y int) int { return x + y}func test() (func(intint) int) { return add}func main() { var a = test() fmt.Println(a(12))}

至於上述兩個的功能,恕小生不才,至今用到的場景很少。

匿名函數

匿名函數顧名思義,就是沒有名字的函數。

語法以下

func([參數,參數...])[(返回值,返回值)]{ 代碼}()//匿名函數後面必須跟括號,直接執行

例如

func() { }()func(x int, y int) (int) { return x + y}()

代碼

package main
import "fmt"
func main() { //s1等於一個匿名函數,而且直接執行 var s1 = func(x int, y int) (int) { return x + y }(12) fmt.Println(s1)}

閉包

閉包,這個有點不太理解,簡單點說就是函數裏面套了一個函數裏面函數引用的外面函數變量

示例

package main
import "fmt"
func other() func() { //返回的是一個函數類型 var a = 666 return func() { //內部函數使用的是外面函數的a fmt.Println(a) }}func main() { var o = other() o()}

執行結果。

結果是沒有問題的。

雖然咱們之前學過,函數執行完畢後,裏面的變量會回收。

可是在用到閉包時,能夠這樣理解,裏面函數使用了外面函數的變量,那這個變量就不會被回收。


總結

本文主要講述了函數及變量高階函數匿名函數閉包,其中閉包是比較難以理解的,必定要花點心思。寶劍鋒從磨礪出,梅花香自苦寒來,必定要多多實踐。

若是在操做過程當中有任何問題,記得下面留言,咱們看到會第一時間解決問題。我是碼農星期八,若是以爲還不錯,記得動手點贊一下哈。感謝你的觀看。

------------------- End -------------------

歡迎你們點贊轉發,轉載,感謝你們的相伴與支持

想加入學習羣請在後臺回覆【入羣

萬水千山老是情,點個【在看】行不行

本文分享自微信公衆號 - Go語言進階學習(gh_dced3d6523fb)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索