天天看點

Go語言函數、方法及變量作用域

函數是程式設計語言的一個基本的代碼塊,邏輯上用于執行一些特定任務。函數是代碼重用的最基本的例子,它把程式中一些頻繁使用的操作抽取出來組成一個獨立的代碼快,通過函數調用來避免重複編寫這部分代碼。

函數

Go語言中沒有類這個概念,是以函數就成了它最基本的組織機關。Go語言中函數的基本概念同其他程式設計語言。

Go語言中最少需要有

main()

函數,這一點同C。

Go語言标準庫中提供了廣泛的内置函數,這裡介紹的主要是自定義函數。

函數定義文法如下:

func function_name([parameter list]) [return_types] {
	// function body
}           

複制

  • func

    函數聲明關鍵字

  • function_name

    函數名稱,自定義,命名規則同變量命名規則

  • parameter_list

    參數清單:參數類型、順序、參數個數,可選

  • return_types

    傳回類型,注意加了s,Go的函數允許多個傳回值,是以需要指定多個傳回類型

注:Go語言中允許将函數作為參數傳遞及将函數作為傳回值。這一點同Python,這是實作閉包的基礎。

函數調用使用函數名,并傳入實參即可。

執行個體:

package main

import "fmt"

func max(n1, n2 int) int {
	if n1 > n2 {
		return n1
	} else {
		return n2
	}
}

func main() {
	fmt.Print(max(4, 8))
}           

複制

函數參數傳遞包括值傳遞和引用傳遞等概念,這一點上Go和其他語言一緻。預設情況下,Go語言使用值傳遞。

遞歸函數

遞歸指的是一個函數不斷調用自身。尾遞歸指的是在return 語句中遞歸調用自身。在一些沒有循環的程式設計語言中,使用尾遞歸來實作循環。

Go語言支援遞歸。

執行個體(斐波那契數列,尾遞歸):

func fibonacci(n int) int {
  	if n < 2 {
   		return n
  	}
  	return fibonacci(n-2) + fibonacci(n-1)
}           

複制

方法

方法其實是屬于面向對象的一個概念,類中的函數被稱作方法。

Go語言中沒有類,但也有方法這個概念。

Go語言中的方法指的是包含了接受者的函數,接收者可以是命名類型或者結構體的一個值或者指針。所有給定類型的方法都屬于該類型的方法集。

方法的定義和函數定義是不一樣的,文法如下:

func (variable_name, variable_data_type) function_name() [return_type] {
	// method body
}           

複制

下面這個執行個體來自菜鳥教程:

package main

import (
   "fmt"  
)

/* 定義結構體 */
type Circle struct {
  radius float64
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("圓的面積 = ", c1.getArea())
}

//該 method 屬于 Circle 類型對象中的方法
func (c Circle) getArea() float64 {
  //c.radius 即為 Circle 類型對象中的屬性
  return 3.14 * c.radius * c.radius
}

// 圓的面積 =  314           

複制

變量的作用域

具備以上概念之後,我們就可以讨論變量的作用域了。

作用域表示已經聲明的變量它再源代碼中起作用的範圍。

  • 函數内部定義的變量稱為局部變量
  • 函數外部定義的程式設計稱為全局變量
  • 函數定義中的變量稱為形式參數
局部變量

因為Go語言以函數作為基本組織機關,是以,局部變量指的是函數内部的變量,局部變量僅在函數體内有效。

全局變量

因為Go語言以函數作為基本組織機關,是以,全局變量指的是函數外部的變量,全局變量可以在整個包甚至外部包中中的任何函數中使用。

形式參數

形參相當于一個占位符,它的值由實參指定。從作用域上來講,形參屬于局部變量。

你可以這麼記憶,花括号内的變量僅在花括号内它被定義後有效,被稱為局部變量。這在所有語言中都是通用的。