自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[432212]]

上次主要回顧

上述我們知道,定義一個函數(shù),可以將函數(shù)內(nèi)存分配理解如下。

同時我們也知道,無論進行什么操作,只會操作棧上面的值。

函數(shù)和變量

函數(shù)名即變量

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

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func say() { 
  6.     fmt.Println("say"
  7.  
  8. func main() { 
  9.     var s1 = say 
  10.     s1() 

執(zhí)行結果如下。

可以發(fā)現(xiàn),通過一個變量接收一個函數(shù)名,在通過變量名+括號執(zhí)行,是沒有問題的。

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

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

執(zhí)行結果

如果我將say函數(shù)改一下呢?

  1. func say(s intint
  2.     fmt.Println("say"
  3.     return 1 
  1. fmt.Printf("%T\n",s1) 

可以發(fā)現(xiàn),如果函數(shù)參數(shù)和返回值不一樣,打印出來的類型也是不一樣的。

定義函數(shù)類型

上述我們知道,可以通過變量接收一個函數(shù)名。

通過變量接收函數(shù)名是沒有約束的,不管函數(shù)幾個參數(shù),幾個返回值,都可以接收,真是活出了動態(tài)語言的樣子。

而定義函數(shù)類型就是限制變量接收函數(shù),只能接收指定格式的函數(shù)。

主要用到type關鍵字。

格式

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

例如

  1. type a func() 
  2. type b func(int
  3. type a func(int,intint 

具體代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. /* 
  6.     定義一個函數(shù)類型的變量 
  7.     接收的函數(shù)參數(shù)必須是兩個int類型 
  8.     函數(shù)的返回值也必須是int類型 
  9. */ 
  10. type cType func(int, intint 
  11.  
  12. func say1(a, b intint { 
  13.     fmt.Println("say",a+b) 
  14.     return 1 
  15. func say2(a, b int) { 
  16.     fmt.Println("say"
  17.  
  18. func main() { 
  19.     var s1 cType 
  20.     s1 = say1//調(diào)用s1其實調(diào)用的就是say1 
  21.     s1(1,1) 
  22.  
  23.     //var s2 cType 
  24.     //s2 = say2//報錯,cannot use say2 (type func(int, int)) as type cType in assignment 

高階函數(shù)

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

簡單點說,高階函數(shù)就是把函數(shù)當作參數(shù)或者把函數(shù)當作返回值。

函數(shù)當作參數(shù)

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func add(x int, y intint { 
  6.     return x + y 
  7. func calc(x int, y int, other func(int, intintint { 
  8.     return other(x, y) 
  9. func main() { 
  10.     //將add函數(shù)傳入第三個參數(shù) 
  11.     var result = calc(34, 12, add
  12.     fmt.Println(result) 

函數(shù)當作返回值

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func add(x int, y intint { 
  6.   return x + y 
  7. func test() (func(int, intint) { 
  8.   return add 
  9. func main() { 
  10.   var a = test() 
  11.   fmt.Println(a(1,2)) 

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

匿名函數(shù)

匿名函數(shù)顧名思義,就是沒有名字的函數(shù)。

  1. func([參數(shù),參數(shù)...])[(返回值,返回值)]{ 
  2.   代碼 
  3. }() 
  4. //匿名函數(shù)后面必須跟括號,直接執(zhí)行 

//匿名函數(shù)后面必須跟括號,直接執(zhí)行

例如

  1. func()  { 
  2.      
  3. }() 
  4. func(x int, y int) (int) { 
  5.   return x + y 
  6. }() 

代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func main() { 
  6.     //s1等于一個匿名函數(shù),并且直接執(zhí)行 
  7.   var s1 = func(x int, y int) (int) { 
  8.     return x + y 
  9.   }(1,2) 
  10.   fmt.Println(s1) 

閉包

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

示例

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func other() func() { 
  6.     //返回的是一個函數(shù)類型 
  7.   var a = 666 
  8.   return func() { 
  9.         //內(nèi)部函數(shù)使用的是外面函數(shù)的a 
  10.     fmt.Println(a) 
  11.   } 
  12. func main() { 
  13.   var o = other() 
  14.   o() 

執(zhí)行結果。

結果是沒有問題的。

雖然我們以前學過,函數(shù)執(zhí)行完畢后,里面的變量會回收。

但是在用到閉包時,可以這樣理解,里面函數(shù)使用了外面函數(shù)的變量,那這個變量就不會被回收。

總結

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

如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。我是碼農(nóng)星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。

 

責任編輯:武曉燕 來源: Go語言進階學習
相關推薦

2020-12-09 09:59:32

Go語言技術

2021-11-03 10:02:07

Go基礎函數(shù)

2020-10-25 07:33:13

Go語言

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2020-11-05 09:58:16

Go語言Map

2022-02-16 10:03:06

對象接口代碼

2020-12-07 05:59:02

語言Go接口

2022-04-27 10:01:43

切片Go封裝

2020-12-30 09:04:32

Go語言TCPUDP

2020-10-23 08:38:19

Go語言

2021-10-09 07:10:31

Go語言基礎

2020-12-27 10:15:44

Go語言channel管道

2020-10-22 11:15:47

Go語言變量

2021-10-16 10:17:51

Go語言數(shù)據(jù)類型

2021-09-29 10:00:07

Go語言基礎

2021-10-13 10:00:52

Go語言基礎

2020-10-27 11:24:29

avaScript m

2020-12-23 08:39:11

Go語言基礎技術

2021-01-13 08:40:04

Go語言文件操作
點贊
收藏

51CTO技術棧公眾號