成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[432212]]

上次主要回顧

上述我們知道,定義一個函數,可以將函數內存分配理解如下。

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

函數和變量

函數名即變量

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

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

執行結果如下。

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

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

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

執行結果

如果我將say函數改一下呢?

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

可以發現,如果函數參數和返回值不一樣,打印出來的類型也是不一樣的。

定義函數類型

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

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

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

主要用到type關鍵字。

格式

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

例如

  1. type a func() 
  2. type b func(int
  3. type a func(intintint 

具體代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. /* 
  6.     定義一個函數類型的變量 
  7.     接收的函數參數必須是兩個int類型 
  8.     函數的返回值也必須是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//調用s1其實調用的就是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 

高階函數

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

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

函數當作參數

  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函數傳入第三個參數 
  11.     var result = calc(34, 12, add
  12.     fmt.Println(result) 

函數當作返回值

  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)) 

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

匿名函數

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

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

//匿名函數后面必須跟括號,直接執行

例如

  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等于一個匿名函數,并且直接執行 
  7.   var s1 = func(x int, y int) (int) { 
  8.     return x + y 
  9.   }(1,2) 
  10.   fmt.Println(s1) 

閉包

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

示例

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

執行結果。

結果是沒有問題的。

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

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

總結

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

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

 

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

2020-12-09 09:59:32

Go語言技術

2020-10-25 07:33:13

Go語言

2021-11-03 10:02:07

Go基礎函數

2020-11-05 09:58:16

Go語言Map

2022-02-16 10:03:06

對象接口代碼

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2021-10-09 07:10:31

Go語言基礎

2022-04-27 10:01:43

切片Go封裝

2020-10-23 08:38:19

Go語言

2020-12-30 09:04:32

Go語言TCPUDP

2020-12-27 10:15:44

Go語言channel管道

2020-12-07 05:59:02

語言Go接口

2021-09-29 10:00:07

Go語言基礎

2021-10-13 10:00:52

Go語言基礎

2020-10-22 11:15:47

Go語言變量

2021-10-16 10:17:51

Go語言數據類型

2020-10-27 11:24:29

avaScript m

2020-12-23 08:39:11

Go語言基礎技術

2020-10-21 09:20:03

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区在线 | 成人免费黄视频 | 久久精品—区二区三区 | 在线免费观看成年人视频 | 欧美视频中文字幕 | 91亚洲精品在线 | 在线精品亚洲欧美日韩国产 | 狠狠狠 | 美国十次成人欧美色导视频 | 国产在线一级片 | 精品国产女人 | av中文字幕在线播放 | 日韩精品一区二区三区中文字幕 | 国产精品久久久久久吹潮 | 欧美一区二区免费 | 亚洲精品久久久久中文字幕二区 | 久久精品99国产精品日本 | 日本高清视频在线播放 | 一区二区三区影院 | 69av网| 国产欧美一区二区三区日本久久久 | 青青久在线视频 | 91精品国产91久久久久久最新 | 久久久久久久电影 | 中文字幕亚洲专区 | 精品欧美一区二区三区久久久 | 日韩av免费看 | 免费人成在线观看网站 | 欧美h版 | 91.xxx.高清在线 | 久久九九影视 | 国产欧美一区二区三区久久 | 国产精品亚洲片在线播放 | 久久久久国产一区二区 | 一二区成人影院电影网 | 毛片一区 | 日韩av在线免费 | 日本不卡高字幕在线2019 | 日本在线免费看最新的电影 | 国户精品久久久久久久久久久不卡 | 户外露出一区二区三区 |