一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - Go 語言的函數(shù)與指針

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

2021-04-14 00:02自然醒的筆記本shenfq Golang

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

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

函數(shù)

 

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

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

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

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

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

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

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

特殊函數(shù)

 

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

 func main()

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

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

 func init()

init 函數(shù)所有的包啟動的時候都會執(zhí)行,執(zhí)行時機(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"

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

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

 

函數(shù)的調(diào)用比較簡單,和其他編程語言類似,只需要將函數(shù)需要接受的參數(shù)傳入其中,在執(zhí)行結(jié)束后,就能得到對應(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) 

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

匿名函數(shù)

 

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

  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é)束后,直接加上一個括號,表示該函數(shù)會立即執(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) 

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

閉包

 

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

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

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

  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) 

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

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

指針

 

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

指針變量聲明

 

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

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

指針變量賦值

 

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

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

值傳遞與引用傳遞

 

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

  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) 

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

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

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

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

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

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

原文地址:https://mp.weixin.qq.com/s/z7gwQrUnMMvkNcV9UMmlZw

延伸 · 閱讀

精彩推薦
  • GolangGolang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類型,在編程語言中標(biāo)識符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語言中標(biāo)識符允許由...

    4272021-11-24
  • Golanggo語言制作端口掃描器

    go語言制作端口掃描器

    本文給大家分享的是使用go語言編寫的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggo日志系統(tǒng)logrus顯示文件和行號的操作

    go日志系統(tǒng)logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang 通過ssh代理連接mysql的操作

    golang 通過ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過ssh代理連接mysql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    a165861639710342021-03-08
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說起,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看...

    Go語言中文網(wǎng)11352020-05-21
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    李浩的life12792020-05-27
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,...

    helight2992020-05-14
  • GolangGolang中Bit數(shù)組的實現(xiàn)方式

    Golang中Bit數(shù)組的實現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧...

    天易獨尊11682021-06-09
主站蜘蛛池模板: 幻女free性摘花第一次 | 国产最强大片免费视频 | 啊啊啊好大在线观看 | 日本高清免费不卡在线 | 沟厕okn系列在线播放 | 午夜在线播放免费人成无 | 窝窝午夜理伦影院 | 国产卡一卡二卡三乱码手机 | 国产51页| 小早川怜子息梦精在线播放 | 精品成人片深夜 | 美女操穴视频 | 亚洲国产精品免费在线观看 | 四虎影院永久网站 | 欧洲一级| 久久青草费线频观看国产 | 青青草国产一区二区三区 | 欧美一级久久久久久久大片 | 91香蕉国产| 久久精品熟女亚洲AV国产 | 91久久青青青国产免费 | 亚洲成人在线播放 | 亚洲婷婷在线视频 | 跪趴好紧h | 精品99一区二区三区麻豆 | 国产亚洲人成网站在线观看不卡 | 秋霞黄色 | 99福利在线观看 | 亚洲高清成人 | 日本捏胸吃奶视频免费 | 日本在线视频免费观看 | 国产香蕉国产精品偷在线观看 | 欧美综合色网 | 亚洲精品成人456在线播放 | 成年性午夜免费视频网站不卡 | chinese壮直男gay老年人 | 天天操天天舔 | 超碰97 | 国产精品区一区二区免费 | 草草国产成人免费视频 | 久久99精品国产免费观看 |