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

Go 語言的函數與指針

開發 后端
函數就是一段基本的代碼塊,一般用來對需要重復執行的代碼進行復用。在 go 中,函數是『一等公民』,這與 js 類似,也就是可以將函數當做一個變量進行傳遞。

[[392723]]

函數

函數就是一段基本的代碼塊,一般用來對需要重復執行的代碼進行復用。在 go 中,函數是『一等公民』,這與 js 類似,也就是可以將函數當做一個變量進行傳遞。

函數聲明

由于是強類型語言,與 js 不同,在函數聲明的過程中,需要指定參數與返回值的類型。

  1. func max (n1, n2 intint { 
  2.   var result int 
  3.   if n1 >= n2 { 
  4.     result = n1 
  5.   } 
  6.   if n1 < n2 { 
  7.     result = n2 
  8.   } 
  9.   return result 

在聲明函數參數和類型的時候,與聲明變量類似,可以一次性指定多個參數的類型,也可以分別指定多個參數為不同類型。

  1. func max (n1 int, n2 intint { 
  2.   …… 

如果函數返回值有多個,在指定返回類型的時候,需要指定每個返回值的類型。

  1. func max (n1 int, n2 int) (error, int) { 
  2.   …… 
  3.   return errors.New(""), result 

上面的代碼,表示返回的時候需要返回兩個值,第一個值為 error 對象,用來表示執行期間是否出現異常。這種方式也是 Node.js 中常見的 error-first callback 的寫法。

特殊函數

在 go 中,有兩個特殊函數:main、init,這兩個函數聲明之后,一般不需要主動調用,會有自動執行的機制。

 func main()

main 函數是 go 語言中默認的入口函數,只能應用于 package main 中,如果在其他的 package 中不會執行。main 函數有如下幾點需要注意:

  • 不能定義參數;
  • 不能定義返回值;
  • 必須在 package main 中聲明;

 func init()

init 函數所有的包啟動的時候都會執行,執行時機比 main 函數早,與 main 函數一樣,不能定義參數和返回值。

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func init() { 
  6.  fmt.Println("執行 init 函數\n"
  7. func main() { 
  8.  fmt.Println("執行 main 函數\n"

函數調用

函數的調用比較簡單,和其他編程語言類似,只需要將函數需要接受的參數傳入其中,在執行結束后,就能得到對應的返回值。

  1. // 定義 max 函數 
  2. func max (n1, n2 intint { 
  3.   var result int 
  4.   if n1 >= n2 { 
  5.     result = n1 
  6.   } 
  7.   if n1 < n2 { 
  8.     result = n2 
  9.   } 
  10.   return result 
  11.  
  12. func main () { 
  13.  var result = max(5, 100) 
  14.  fmt.Println("max return", result) 

匿名函數

匿名函數就是一個沒有定義函數名的函數,匿名函數可以當成一個值,將其賦值放到某個變量中。這也是之前為什么說函數是『一等公民』,就是可以將函數當成一個變量。

  1. var max = func (n1, n2 intint { 
  2.   var result int 
  3.   if n1 >= n2 { 
  4.     result = n1 
  5.   } 
  6.   if n1 < n2 { 
  7.     result = n2 
  8.   } 
  9.   return result 
  10. var result = max(5, 100) 
  11. fmt.Println("max return", result) 

立即執行函數

由于 go 中的函數是 『一等公民』,可以在聲明之后立即執行,就是在函數聲明結束后,直接加上一個括號,表示該函數會立即執行,執行之后的結果可以通過變量進行接收。

  1. import "math" 
  2.  
  3. var Pi = func () float64 { 
  4.   return math.Pi 
  5. }() 
  6.  
  7. fmt.Println("PI =",Pi) 

閉包

“閉包就是能夠讀取其他函數內部變量的函數。在本質上,閉包是將函數內部和函數外部連接起來的橋梁。 ——百度百科

上面的描述來自百度百科,初次看概念比較難理解,如果站在使用的角度來說,閉包就是在一個函數調用后,返回另一個匿名函數,并保持當前函數內的局部變量,可以給匿名函數引用。

下面我們可以簡單實現一個迭代器函數,該函數接受一個切片,返回一個匿名函數,該匿名函數每次執行,都會取出切片的一個值,直到全部讀取。

  1. func generate(slice []int) func() (bool, int) { 
  2.  i := 0 
  3.  length := len(slice) 
  4.  return func () (bool, int) { 
  5.   if i >= length { 
  6.    return true, 0 
  7.   } 
  8.   var result = slice[i] 
  9.   i++ 
  10.   return false, result 
  11.  } 
  12.  
  13. func main() { 
  14.  slice := []int{1, 2, 3, 4, 5} 
  15.  nextNum := generate(slice) 
  16.  done, result := nextNum() 
  17.   // 直到 done 不等于 false,才停止 
  18.  for done == false { 
  19.   fmt.Println(result, done) 
  20.   done, result = nextNum() 
  21.  } 
  22.   fmt.Println(result, done) 

指針

我們前面常說的變量指的一般是一個值,指針是指向該變量存儲在內存的位置。指針也可以存儲在一個變量中,該變量稱為『指針變量』。

指針變量聲明

聲明指針變量時,需要指針指向哪一種類型,因為不同類型的值在內存占用的空間大小不一樣,僅僅知道內存地址還是不夠,還需要知道該變量在內存中占用多大空間。聲明指針變量只需要在類型前,加上 * 即可。

  1. var point *int // 聲明 int 類型的指針 

指針變量賦值

給指針變量賦值,需要在對應類型的變量前加上&符號,表示取出該變量的地址。

  1. var i = 1 
  2. var point *int 
  3. point = &i 

值傳遞與引用傳遞

一般情況下,我們傳入函數的參數僅為變量的值,這樣的傳遞被稱為值傳遞,在函數內對參數修改也不會影響到外部變量。

  1. func addOne(slice []int, number int) { 
  2.  slice = append(slice, number) 
  3.  fmt.Println("inner slice =",  slice) 
  4.  
  5. slice := []int{1, 2, 3} 
  6. addOne(slice, 100) 
  7. fmt.Println("outer slice =",  slice) 

上述代碼中,我們寫了一個函數,會對傳入的切片追加一個值,調用之后,我們會發現外部切片的值并沒有發生變量。

如果需要外部變量的值會跟隨函數調用發生變化,就需要將變量的指針傳入函數中,這樣的傳遞被稱為引用傳遞。這樣在函數中修改參數就會影響到外部的變量了。

  1. // 此時 slice 為指針變量 
  2. func addOne(slice *[]int, number int) { 
  3.   // 通過 *slice 可以取出 slice 指針對應的值 
  4.  *slice = append(*slice, number) 
  5.  fmt.Println("inner slice =",  *slice) 
  6.  
  7. slice := []int{1, 2, 3} 
  8. addOne(&slice, 100) 
  9. fmt.Println("outer slice =",  slice) 

 

責任編輯:武曉燕 來源: 自然醒的筆記本
相關推薦

2021-09-27 22:49:13

GoC 指針

2021-01-13 06:58:35

C語言函數指針

2011-07-15 01:20:58

C指針函數函數指針

2025-05-12 00:55:34

2021-07-30 07:28:15

WorkerPoolGo語言

2021-04-07 09:02:49

Go 語言變量與常量

2025-02-06 16:48:01

2021-04-20 09:00:48

Go 語言結構體type

2021-07-13 06:44:04

Go語言數組

2022-03-27 23:11:39

Go語言函數

2022-11-06 23:17:23

Go語言項目

2020-07-07 07:00:00

RustGo語言編程語言

2022-07-04 14:41:31

Go 語言變長參數變長參數函數

2023-04-09 23:09:59

Go語言函數

2021-10-16 17:53:35

Go函數編程

2022-07-03 23:07:48

Go語言參數

2024-01-06 08:16:19

init?函數數據開發者

2015-03-09 09:34:04

C語言函數指針

2023-09-14 12:35:28

寄存器

2023-10-26 11:19:21

指針Go
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 自拍视频网站 | 久久专区 | 亚洲狠狠爱一区二区三区 | 一区二区国产精品 | 亚洲精品久久久久久久久久久久久 | 成人精品一区亚洲午夜久久久 | 日韩精品一区二区三区 | 国产精品不卡一区二区三区 | 精品一区二区三区视频在线观看 | 国产乱码久久久久久 | 亚洲国产精品一区二区第一页 | 免费在线观看毛片 | 欧美国产精品一区二区三区 | 国产一区二区三区久久 | 综合九九| 亚洲男人天堂网 | 亚洲综合视频一区 | 91精品国产高清一区二区三区 | aaa在线观看 | 国产乱码精品1区2区3区 | 久久精品国产一区二区电影 | 成人精品毛片国产亚洲av十九禁 | 国产综合视频 | 不卡一区 | 91av免费看 | 欧美视频在线观看 | 中文字幕在线播放第一页 | 欧美成人一区二区三区 | 久久综合狠狠综合久久 | 久久综合狠狠综合久久综合88 | 全免费a级毛片免费看视频免 | 日韩中文一区二区 | 成人九色 | 女女爱爱视频 | 国产一区二区三区免费观看在线 | 免费看黄视频网站 | 中文字幕一区二区三区乱码图片 | 国产精品成人在线播放 | 亚洲欧美综合精品久久成人 | 狠狠躁夜夜躁人人爽天天高潮 | 国产成人综合网 |