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

Go 語言的函數(shù)與指針

開發(fā) 后端
函數(shù)就是一段基本的代碼塊,一般用來對(duì)需要重復(fù)執(zhí)行的代碼進(jìn)行復(fù)用。在 go 中,函數(shù)是『一等公民』,這與 js 類似,也就是可以將函數(shù)當(dāng)做一個(gè)變量進(jìn)行傳遞。

[[392723]]

函數(shù)

函數(shù)就是一段基本的代碼塊,一般用來對(duì)需要重復(fù)執(zhí)行的代碼進(jìn)行復(fù)用。在 go 中,函數(shù)是『一等公民』,這與 js 類似,也就是可以將函數(shù)當(dāng)做一個(gè)變量進(jìn)行傳遞。

函數(shù)聲明

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

  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 

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

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

如果函數(shù)返回值有多個(gè),在指定返回類型的時(shí)候,需要指定每個(gè)返回值的類型。

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

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

特殊函數(shù)

在 go 中,有兩個(gè)特殊函數(shù):main、init,這兩個(gè)函數(shù)聲明之后,一般不需要主動(dòng)調(diào)用,會(huì)有自動(dòng)執(zhí)行的機(jī)制。

 func main()

main 函數(shù)是 go 語言中默認(rèn)的入口函數(shù),只能應(yīng)用于 package main 中,如果在其他的 package 中不會(huì)執(zhí)行。main 函數(shù)有如下幾點(diǎn)需要注意:

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

 func init()

init 函數(shù)所有的包啟動(dòng)的時(shí)候都會(huì)執(zhí)行,執(zhí)行時(shí)機(jī)比 main 函數(shù)早,與 main 函數(shù)一樣,不能定義參數(shù)和返回值。

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

函數(shù)調(diào)用

函數(shù)的調(diào)用比較簡單,和其他編程語言類似,只需要將函數(shù)需要接受的參數(shù)傳入其中,在執(zhí)行結(jié)束后,就能得到對(duì)應(yīng)的返回值。

  1. // 定義 max 函數(shù) 
  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) 

匿名函數(shù)

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

  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) 

立即執(zhí)行函數(shù)

由于 go 中的函數(shù)是 『一等公民』,可以在聲明之后立即執(zhí)行,就是在函數(shù)聲明結(jié)束后,直接加上一個(gè)括號(hào),表示該函數(shù)會(huì)立即執(zhí)行,執(zhí)行之后的結(jié)果可以通過變量進(jìn)行接收。

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

閉包

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

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

下面我們可以簡單實(shí)現(xiàn)一個(gè)迭代器函數(shù),該函數(shù)接受一個(gè)切片,返回一個(gè)匿名函數(shù),該匿名函數(shù)每次執(zhí)行,都會(huì)取出切片的一個(gè)值,直到全部讀取。

  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) 

指針

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

指針變量聲明

聲明指針變量時(shí),需要指針指向哪一種類型,因?yàn)椴煌愋偷闹翟趦?nèi)存占用的空間大小不一樣,僅僅知道內(nèi)存地址還是不夠,還需要知道該變量在內(nèi)存中占用多大空間。聲明指針變量只需要在類型前,加上 * 即可。

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

指針變量賦值

給指針變量賦值,需要在對(duì)應(yīng)類型的變量前加上&符號(hào),表示取出該變量的地址。

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

值傳遞與引用傳遞

一般情況下,我們傳入函數(shù)的參數(shù)僅為變量的值,這樣的傳遞被稱為值傳遞,在函數(shù)內(nèi)對(duì)參數(shù)修改也不會(huì)影響到外部變量。

  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) 

上述代碼中,我們寫了一個(gè)函數(shù),會(huì)對(duì)傳入的切片追加一個(gè)值,調(diào)用之后,我們會(huì)發(fā)現(xiàn)外部切片的值并沒有發(fā)生變量。

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

  1. // 此時(shí) slice 為指針變量 
  2. func addOne(slice *[]int, number int) { 
  3.   // 通過 *slice 可以取出 slice 指針對(duì)應(yīng)的值 
  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) 

 

責(zé)任編輯:武曉燕 來源: 自然醒的筆記本
相關(guān)推薦

2021-01-13 06:58:35

C語言函數(shù)指針

2021-09-27 22:49:13

GoC 指針

2011-07-15 01:20:58

C指針函數(shù)函數(shù)指針

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 語言結(jié)構(gòu)體type

2022-03-27 23:11:39

Go語言函數(shù)

2022-07-04 14:41:31

Go 語言變長參數(shù)變長參數(shù)函數(shù)

2023-04-09 23:09:59

Go語言函數(shù)

2022-11-06 23:17:23

Go語言項(xiàng)目

2021-07-13 06:44:04

Go語言數(shù)組

2022-07-03 23:07:48

Go語言參數(shù)

2021-10-16 17:53:35

Go函數(shù)編程

2024-01-06 08:16:19

init?函數(shù)數(shù)據(jù)開發(fā)者

2020-07-07 07:00:00

RustGo語言編程語言

2023-09-14 12:35:28

寄存器

2015-03-09 09:34:04

C語言函數(shù)指針

2010-02-06 09:31:42

C++函數(shù)對(duì)象

2023-10-26 11:19:21

指針Go
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)