go語言中函數是什麼意思

2022-12-08 22:01:07

在go語言中,函數是組織好的、可重複使用的、用來實現單一具體或相關聯功能的程式碼段(塊);其主要目的是提高應用的模組性和程式碼的重複利用率,更好的管理程式碼,模組化開發。函數通常使用引數和返回值,與呼叫者互動資料;引數給函數傳遞資料,返回值,函數將處理好的資料傳遞給呼叫者。

php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

函數是組織好的、可重複使用的、用來實現單一或相關聯功能的程式碼段,其可以提高應用的模組性和程式碼的重複利用率。

函數概述

函數,function,獨立的,用於實現具體功能的程式碼塊。主要目的,是程式碼的重用(重複使用),更好的管理程式碼,模組化開發。 函數通常使用引數和返回值,與呼叫者互動資料。引數給函數傳遞資料,返回值,函數將處理好的資料傳遞給呼叫者。 Go語言中函數被稱為一等公民(first-class)。意味著支援高階函數,支援匿名函數,支援閉包等特性,可以滿足介面等高階函數特性。

函數定義

函數構成了程式碼執行的邏輯結構,在Go語言中,函數的基本組成為:關鍵字 func、函數名、參數列、返回值、函數體和返回語句,每一個程式都包含很多的函數,函數是基本的程式碼塊。

語法:

  • 定義:

func 函數名(形參列表)(返回值型別列表) {
  函數體,通常會有return語句,返回值
}
登入後複製
  • 呼叫:

函數名(實參列表)
登入後複製

函數名:函數的識別符號,用於找到函數,內部是一個指向函數程式碼的地址。 形參列表:由變數和型別構成 返回值型別列表:函數返回值的型別,多個返回值需要指定多個。 函數體:實現函數功能的具體語句。 return語句:返回值語句

以上定的為命名函數,不能定義在其他函數內部。

函數引數

用於在呼叫函數時向函數傳遞資料。 實參,實際引數。呼叫時給的引數。指的是具有的特定實際資料的引數。 形參,形式引數。定義時使用的引數。指的是用來表示函數需要引數,而定義時引數是沒有任實際何資料的。 當呼叫時會發生使用實參為形參變數賦值的過程,稱為引數的傳遞。在函數的執行期間,形參是有具體資料的,形參當於函數內宣告的變數。

引數的傳遞,分為值傳遞,地址傳遞兩種方式。地址傳遞時,需要形參定義為指標型別,呼叫時需要取得地址傳參。範例程式碼:

func funcTest(p1 int, p2 *int) {
  p1++
  *p2++
  fmt.Println(p1, *p2)
}
func main() {
  var (
    a1 = 42
    a2 = 42
  )
  funcTest(a1, &a2)
  // 引數賦值過程
  fmt.Println(a1, a2)
}
登入後複製

以上會輸出

43 43
42 43
登入後複製

值傳遞,函數會得到實參的一份拷貝。地址傳遞,函數會得到實參地址,這樣函數內通過地址對變數的修改,同時影響實參。

Go支援rest...不定數量引數,定義時將不定數量形參放在形參列表的最後定義,使用 ...Type的方式,演示:

定義:
func funcTest(op string, nums ...int) {
  fmt.Println(nums) // [4, 1, 55, 12], slice切片型資料
}
呼叫
funcTest("someOp", 4, 1, 55, 12)
登入後複製

接收到的引數為slice切片型別。

函數返回值

return語句用於生成返回值。需要在函數定義時確定返回值型別,支援多值返回。演示語法:

func funcTest() (int, string) {
  return 42, "Hank"
}
登入後複製

可以在定義時,宣告返回的變數。這個做法叫命名返回,演示為:

func funcTest() (num int, title string) {
  num = 42
  title = "Hank"
  return
}
登入後複製

不用return任何資料,直接return即可!

函數變數

函數可以看作一種特殊的指標型別,可以和其他型別一樣被儲存在變數中。通過函數識別符號和變數都可以存取到該函數,演示如下:

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()
}
登入後複製

執行結果:

func(), (0x48fe20)
func(), (0x48fe20)
func() type
func() type
登入後複製

可見,函數識別符號就是指向函數的指標。可以賦值給其他變數。

函數引數

函數也可以作為其他函數的引數來使用,演示如下:

func funcSuccess() {
}
func funcAsync(handle func()) {
  // 呼叫函數引數
  handle()
}
// 傳遞函數到其他函數
funcAsync(success)
登入後複製

這種回撥函數的使用語法,在處理非同步邏輯時十分有用。

匿名函數

可以定義匿名函數。可以將匿名函數儲存到變數中,作為引數傳遞,或者立即呼叫。如果函數時臨時使用函數,則匿名函數是一個好選擇。範例語法:

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

// 作為引數
someFunc(func() {
  })

// 立即呼叫
func() {
  }()
登入後複製

閉包

由於匿名函數可以定義在其他函數內,同時變數的作用域為層疊的,也就是匿名函數可以會存取其所在的外層函數內的區域性變數。當外層函數執行結束後,匿名函數會與其使用的外部函數的區域性變數形成閉包。範例程式碼:

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

outer()
fn() // 43
登入後複製

此例中,fn 對應的匿名函數與 outer() 的區域性變數 v,就形成了閉包。

函數呼叫示意圖

var v = "global"
func funcTest(v) {
  v = "funcTest"
  fmt.Println(v)
}
func main() {
  v := "main"
  funcTest(v)
}
登入後複製

程式碼編譯期間,會將函數程式碼存放在記憶體程式碼區。 函數被呼叫時,在執行期間會在函數執行棧區開闢函數棧,內部由區域性變數識別符號列表(就是區域性變數),上層識別符號列表參照等資訊。直到執行結束,此空間才會被出棧,釋放。 函數內部呼叫了新函數,新函數的執行空間入棧,要等到新函數執行空間出棧,呼叫他的函數才會被出棧。 以上程式碼的執行邏輯圖如下:

1.png

遞迴呼叫

函數內部呼叫函數本身。稱之為遞迴呼叫。範例程式碼:

func funcTest() {
  fmt.Println("run")
  funcTest()
}
登入後複製

定義實現遞迴呼叫函數時,通常需要定義一個出口。用來確定何時不再進行遞迴呼叫了。一旦滿足條件,則呼叫停止。例如:

func funcTest(v) {
  fmt.Println(v, "run")
  v ++
  if v <= 10 {
    funcTest()
  }
}
登入後複製

典型的應用有,樹狀選單的處理,遍歷目錄,快速排序等。 遞迴呼叫的優勢是編碼簡單,與描述的業務邏輯保持一致。

【相關推薦:Go視訊教學

以上就是go語言中函數是什麼意思的詳細內容,更多請關注TW511.COM其它相關文章!