首頁  >  文章  >  後端開發  >  go語言函數中函數是什麼意思

go語言函數中函數是什麼意思

青灯夜游
青灯夜游原創
2022-12-08 19:48:396121瀏覽

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

go語言函數中函數是什麼意思

本教學操作環境: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)
}

代码编译期间,会将函数代码存放在内存代码区。 函数被调用时,在运行期间会在函数运行栈区开辟函数栈,内部由局部变量标识符列表(就是局部变量),上层标识符列表引用等信息。直到运行结束,此空间才会被出栈,释放。 函数内部调用了新函数,新函数的执行空间入栈,要等到新函数执行空间出栈,调用他的函数才会被出栈。 以上代码的运行逻辑图如下:

go語言函數中函數是什麼意思

递归调用

函数内部调用函数本身。称之为递归调用。示例代码:

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

定义实现递归调用函数时,通常需要定义一个出口。用来确定何时不再进行递归调用了。一旦满足条件,则调用停止。例如:

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

典型的应用有,树状菜单的处理,遍历目录,快速排序等。 递归调用的优势是编码简单,与描述的业务逻辑保持一致。

【相关推荐:Go视频教程

以上是go語言函數中函數是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn