Go語(yǔ)言中的函數(shù)

1 概述

函數(shù),function,獨(dú)立的,用于實(shí)現(xiàn)具體功能的代碼塊。主要目的,是代碼的重用(重復(fù)使用),更好的管理代碼,模塊化開發(fā)。
函數(shù)通常使用參數(shù)和返回值,與調(diào)用者交互數(shù)據(jù)。參數(shù)給函數(shù)傳遞數(shù)據(jù),返回值,函數(shù)將處理好的數(shù)據(jù)傳遞給調(diào)用者。
Go語(yǔ)言中函數(shù)被稱為一等公民(first-class)。意味著支持高階函數(shù),支持匿名函數(shù),支持閉包等特性,可以滿足接口等高級(jí)函數(shù)特性。

專業(yè)從事企業(yè)網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)服務(wù),包括網(wǎng)站建設(shè)、申請(qǐng)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱、微信公眾號(hào)開發(fā)、微信支付寶小程序設(shè)計(jì)、app軟件開發(fā)、軟件開發(fā)、等服務(wù)。公司始終通過(guò)不懈的努力和以更高的目標(biāo)來(lái)要求自己,在不斷完善自身管理模式和提高技術(shù)研發(fā)能力的同時(shí),大力倡導(dǎo)推行新經(jīng)濟(jì)品牌戰(zhàn)略,促進(jìn)互聯(lián)網(wǎng)事業(yè)的發(fā)展。

2 定義

語(yǔ)法:

定義:
func 函數(shù)名(形參列表)(返回值類型列表) {
  函數(shù)體,通常會(huì)有return語(yǔ)句,返回值
}
調(diào)用:
函數(shù)名(實(shí)參列表)

函數(shù)名:函數(shù)的標(biāo)識(shí)符,用于找到函數(shù),內(nèi)部是一個(gè)指向函數(shù)代碼的地址。
形參列表:由變量和類型構(gòu)成
返回值類型列表:函數(shù)返回值的類型,多個(gè)返回值需要指定多個(gè)。
函數(shù)體:實(shí)現(xiàn)函數(shù)功能的具體語(yǔ)句。
return語(yǔ)句:返回值語(yǔ)句

以上定的為命名函數(shù),不能定義在其他函數(shù)內(nèi)部。

3 參數(shù)

用于在調(diào)用函數(shù)時(shí)向函數(shù)傳遞數(shù)據(jù)。
實(shí)參,實(shí)際參數(shù)。調(diào)用時(shí)給的參數(shù)。指的是具有的特定實(shí)際數(shù)據(jù)的參數(shù)。
形參,形式參數(shù)。定義時(shí)使用的參數(shù)。指的是用來(lái)表示函數(shù)需要參數(shù),而定義時(shí)參數(shù)是沒有任實(shí)際何數(shù)據(jù)的。
當(dāng)調(diào)用時(shí)會(huì)發(fā)生使用實(shí)參為形參變量賦值的過(guò)程,稱為參數(shù)的傳遞。在函數(shù)的執(zhí)行期間,形參是有具體數(shù)據(jù)的,形參當(dāng)于函數(shù)內(nèi)聲明的變量。

參數(shù)的傳遞,分為值傳遞,地址傳遞兩種方式。地址傳遞時(shí),需要形參定義為指針類型,調(diào)用時(shí)需要取得地址傳參。示例代碼:

func funcTest(p1 int, p2 *int) {
  p1++
  *p2++
  fmt.Println(p1, *p2)
}
func main() {
  var (
    a1 = 42
    a2 = 42
  )
  funcTest(a1, &a2)
  // 參數(shù)賦值過(guò)程
  fmt.Println(a1, a2)
}
以上會(huì)輸出
43 43
42 43

值傳遞,函數(shù)會(huì)得到實(shí)參的一份拷貝。地址傳遞,函數(shù)會(huì)得到實(shí)參地址,這樣函數(shù)內(nèi)通過(guò)地址對(duì)變量的修改,同時(shí)影響實(shí)參。

Go支持rest...不定數(shù)量參數(shù),定義時(shí)將不定數(shù)量形參放在形參列表的最后定義,使用 ...Type的方式,演示:

定義:
func funcTest(op string, nums ...int) {
  fmt.Println(nums) // [4, 1, 55, 12], slice切片型數(shù)據(jù)
}
調(diào)用
funcTest("someOp", 4, 1, 55, 12)

接收到的參數(shù)為slice切片類型。

4 返回值

return語(yǔ)句用于生成返回值。需要在函數(shù)定義時(shí)確定返回值類型,支持多值返回。演示語(yǔ)法:

func funcTest() (int, string) {
  return 42, "Hank"
}

可以在定義時(shí),聲明返回的變量。這個(gè)做法叫命名返回,演示為:

func funcTest() (num int, title string) {
  num = 42
  title = "Hank"
  return
}

不用return任何數(shù)據(jù),直接return即可!

5 函數(shù)變量

函數(shù)可以看作一種特殊的指針類型,可以和其他類型一樣被保存在變量中。通過(guò)函數(shù)標(biāo)識(shí)符和變量都可以訪問(wèn)到該函數(shù),演示如下:

func funcTest() {
  fmt.Println("func() type")
}
func main() {
  fmt.Printf("%T, (%v)\n", funcTest, funcTest)
  fn := funcTest
  fmt.Printf("%T, (%v)\n", fn, fn)
  funcTest()
  fn()
}
執(zhí)行結(jié)果:
func(), (0x48fe20)
func(), (0x48fe20)
func() type
func() type

可見,函數(shù)標(biāo)識(shí)符就是指向函數(shù)的指針??梢再x值給其他變量。

6 函數(shù)參數(shù)

函數(shù)也可以作為其他函數(shù)的參數(shù)來(lái)使用,演示如下:

func funcSuccess() {
}
func funcAsync(handle func()) {
  // 調(diào)用函數(shù)參數(shù)
  handle()
}
// 傳遞函數(shù)到其他函數(shù)
funcAsync(success)

這種回調(diào)函數(shù)的使用語(yǔ)法,在處理異步邏輯時(shí)十分有用。

7 匿名函數(shù)

可以定義匿名函數(shù)??梢詫⒛涿瘮?shù)保存到變量中,作為參數(shù)傳遞,或者立即調(diào)用。如果函數(shù)時(shí)臨時(shí)使用函數(shù),則匿名函數(shù)是一個(gè)好選擇。示例語(yǔ)法:

賦值給變量
fn := func() {
}
fn()

// 作為參數(shù)
someFunc(func() {
  })

// 立即調(diào)用
func() {
  }()

8 閉包

由于匿名函數(shù)可以定義在其他函數(shù)內(nèi),同時(shí)變量的作用域?yàn)閷盈B的,也就是匿名函數(shù)可以會(huì)訪問(wèn)其所在的外層函數(shù)內(nèi)的局部變量。當(dāng)外層函數(shù)運(yùn)行結(jié)束后,匿名函數(shù)會(huì)與其使用的外部函數(shù)的局部變量形成閉包。示例代碼:

var fn func()
func outer() {
  v := 42
  fn = func() {
    v ++
    fmt.Print(v)
  }
}

outer()
fn() // 43

此例中,fn 對(duì)應(yīng)的匿名函數(shù)與 outer() 的局部變量 v,就形成了閉包。

9 函數(shù)調(diào)用示意圖

var v = "global"
func funcTest(v) {
  v = "funcTest"
  fmt.Println(v)
}
func main() {
  v := "main"
  funcTest(v)
}

代碼編譯期間,會(huì)將函數(shù)代碼存放在內(nèi)存代碼區(qū)。
函數(shù)被調(diào)用時(shí),在運(yùn)行期間會(huì)在函數(shù)運(yùn)行棧區(qū)開辟函數(shù)棧,內(nèi)部由局部變量標(biāo)識(shí)符列表(就是局部變量),上層標(biāo)識(shí)符列表引用等信息。直到運(yùn)行結(jié)束,此空間才會(huì)被出棧,釋放。
函數(shù)內(nèi)部調(diào)用了新函數(shù),新函數(shù)的執(zhí)行空間入棧,要等到新函數(shù)執(zhí)行空間出棧,調(diào)用他的函數(shù)才會(huì)被出棧。
以上代碼的運(yùn)行邏輯圖如下:
Go語(yǔ)言中的函數(shù)

10 遞歸調(diào)用

函數(shù)內(nèi)部調(diào)用函數(shù)本身。稱之為遞歸調(diào)用。示例代碼:

func funcTest() {
  fmt.Println("run")
  funcTest()
}

定義實(shí)現(xiàn)遞歸調(diào)用函數(shù)時(shí),通常需要定義一個(gè)出口。用來(lái)確定何時(shí)不再進(jìn)行遞歸調(diào)用了。一旦滿足條件,則調(diào)用停止。例如:

func funcTest(v) {
  fmt.Println(v, "run")
  v ++
  if v <= 10 {
    funcTest()
  }
}

典型的應(yīng)用有,樹狀菜單的處理,遍歷目錄,快速排序等。
遞歸調(diào)用的優(yōu)勢(shì)是編碼簡(jiǎn)單,與描述的業(yè)務(wù)邏輯保持一致。

完!
原文出自:小韓說(shuō)課
微信關(guān)注:小韓說(shuō)課
Go語(yǔ)言中的函數(shù)

網(wǎng)站標(biāo)題:Go語(yǔ)言中的函數(shù)
文章出自:http://muchs.cn/article32/johgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、商城網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、電子商務(wù)、定制開發(fā)、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司