您好,登錄后才能下訂單哦!
今天小編給大家分享一下Go語言函數怎么定義與使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
函數是一段代碼的片段,包含連續的執行語句,它可以將零個或多個輸入參數映射到零個或多個參數輸出。函數像一個黑盒,對它的使用者隱藏實現細節。還可以在代碼中通過函數調用來執行它們。
學到現在,我們使用的 Go 函數只有 main
函數:
func main() { }
每個函數都包含 func
關鍵字、函數名、輸入參數列表、一個可選的返回列表以及函數體
func name(parameter-list) (result-list) { function body }
func
關鍵字:Go 語言使用 func
關鍵字來聲明一個函數。類似 Python 的 def
關鍵字。
函數名:緊跟 func
關鍵字后的事函數名稱,函數名必須是一個標識符,即不能跟 Go 語言關鍵字沖突
輸入參數列表(形參列表):輸入參數聲明列表必須用一對小括號括起來,指定一組變量的參數名和參數類型,這些局部變量都由調用者提供的實參傳遞而來。
輸出結果列表(返回列表):指定了函數返回值的類型。當函數返回一個未命名的返回值或者沒有返回值的時候,返回列表的圓括號可以省略。在 Go 中,一個函數可以有多個返回值。
函數體:函數體必須用一對大括號括起來。一對大括號和它其間的代碼形成了一個顯式代碼塊。在一個函數體內, return
關鍵字可以用來結束此函數的正常執行流程并進入此函數的退出階段。
接下來,看一個簡單的 Go 整數計算器的 加、減、乘、除 函數的例子。
package main import "fmt" func add(num1 int, num2 int) (num3 int) { num3 = num1 + num2 return } func subtract(num1 int, num2 int) int { num3 := num1 - num2 return num3 } func multiply(num1 int, num2 int) int { result := num1 * num2 return result } func divide(num1 int, num2 int) (result int) { if num2 != 0 { result = num1 / num2 } else { panic("division by zero") } return result } func main() { fmt.Printf("2021 + 19 = %d\n", add(2021, 19)) fmt.Printf("2021 - 19 = %d\n", subtract(2021, 19)) fmt.Printf("2021 * 19 = %d\n", multiply(2021, 19)) fmt.Printf("2021 / 19 = %d\n", divide(2021, 19)) // fmt.Printf("2021 / 0 = %d\n", divide(2021, 0)) }
結果為:
2021 + 19 = 2040
2021 - 19 = 2002
2021 * 19 = 38399
2021 / 19 = 106
如果我們除以 0 的話,調用了一個叫做 panic
的內置函數,該函數會導致一個運行時的錯誤。還會得到一個異常,異常也會在接下來的博客中學習到。
panic: division by zero goroutine 1 [running]: main.divide(...) ...
Go 支持一個函數返回多個值:
func f() (int, int){ return 2014, 2021 } func main() { x, y := f() }
這里需要做三個改變:
返回類型改變:多個返回類型用多個逗號,
分隔的類型,
改變 return
后的表達式:使其包含多個逗號,
的表達式,
最后改變賦值語句,使多個值都在 :=
或 =
的左邊
多個返回值一般用于返回 error,例如 (x, err := f())
, 或者返回一個布爾值表示成功,如 (x, ok := f())
.
對于 Go 函數中的最后一個參數,有一種特殊的形式可以使用:
func add(args ...int) int { total := 0 for _, v := range args { total += v } return total } func main() { fmt.Println(add(1,2,3)) }
通過在最后一個參數的類型名稱前使用 ...
,你可以表示它需要零個或多個這些 參數。在這種情況下,我們需要零個或多個整數。我們像其他函數一樣調用該函數,而且可以傳遞我們想要的任何數量的變量。
這正是 fmt.Println
函數的實現方式:
func Println(a ...interface{}) (n int, err error)
Println()
函數可以接受任何數量的任何類型的值。我們也可以通過在 slice 后面加上 ...
來傳遞一個 ints
的 slice 。
func main() { s1 := []int{1,2,3} fmt.Println(add(s1...)) }
可以在函數內部創建函數。
func main() { add := func(x, y int) int { return x + y } fmt.Println(add(1,1)) }
add
是一個局部變量,其類型為 func(int, int) int
(一個函數接收兩個 int 參數,并返回一個 int 參數)。當你創建一個像這樣的局部函數時,它還可以訪問其他局部變量。
最后,一個函數能夠調用自己。下面是一種方法來計算一個數字的階乘。
package main import "fmt" func factorial(x uint) uint { if x == 0 { return 1 } return x * factorial(x-1) } func main() { fmt.Println(factorial(4)) }
閉包和遞歸是強大的編程技術,它構成了被稱為函數式編程的范式的基礎。大多數人都會發現函數式編程比以下方法更難理解:for 循環、if 語句、變量和簡單函數的方法。
以上就是“Go語言函數怎么定義與使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。