日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Go語(yǔ)言的函數(shù)與指針

函數(shù)

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

函數(shù)聲明

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

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

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

 
 
 
 
  1. func max (n1 int, n2 int) int {
  2.   ……
  3. }

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

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

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

特殊函數(shù)

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

 func main()

main 函數(shù)是 go 語(yǔ)言中默認(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. import "fmt"
  3. func init() {
  4.  fmt.Println("執(zhí)行 init 函數(shù)\n")
  5. }
  6. func main() {
  7.  fmt.Println("執(zhí)行 main 函數(shù)\n")
  8. }

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

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

 
 
 
 
  1. // 定義 max 函數(shù)
  2. func max (n1, n2 int) int {
  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)
  15. }

匿名函數(shù)

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

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

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

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

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

閉包

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

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

下面我們可以簡(jiǎn)單實(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)
  23. }

指針

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

指針變量聲明

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

 
 
 
 
  1. var point *int // 聲明 int 類(lèi)型的指針

指針變量賦值

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

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

值傳遞與引用傳遞

一般情況下,我們傳入函數(shù)的參數(shù)僅為變量的值,這樣的傳遞被稱(chēng)為值傳遞,在函數(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)

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

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

 
 
 
 
  1. // 此時(shí) slice 為指針變量
  2. func addOne(slice *[]int, number int) {
  3.   // 通過(guò) *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)

文章標(biāo)題:Go語(yǔ)言的函數(shù)與指針
瀏覽路徑:http://www.5511xx.com/article/cosjsoo.html