可能會遇到的雷點
func foo(a, b int)(mul int, div int){
mul = a * b
div = a / b
return mul , div
}
在上述代碼中,定義了一個名為foo
的函數,它接受兩個整數型參數並返回兩個整數型結果。這個函數計算了兩個整數的乘積和商。
(a, b int)
a
和b
,型別int
。a
和b
都是整數型,所以可以寫作a, b int
,而不是a int, b int
。(mul int, div int)
mul
和div
。return
語句中省略。在這個例子中,直接返回了mul
和div
。(int, int)
。在這種情況下,return
語句必須明確指定要返回的值。func add(a , b int)(result int){
result = a+b
return result
}
func add(a , b int)(result int){
result = a+b
return
}
func param(a , b int)(a , b int){
return a , b
}
c, d := param(1,2)
但也可以忽略某些值
_, d := param(1,2)
然而因為我們是使用 :=
短變數宣告,故左邊一定要有實際變數,不能都是_
你的描述中提到了Go語言中不定參數的重要特性。下面我將整理並擴展一些細節:
不定參數函數允許你傳遞任意數量的參數。這是通過在參數的類型前加上三個點...
來達成的。
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
nums
來訪問。聲明不定參數函數: 如上所述,可以使用三個點來定義不定數量的參數。
解引用切片: 如果你有一個切片並且想將其元素作為不定參數傳遞給函數,你可以使用三個點。
nums := []int{1, 2, 3}
total := sum(nums...) // 傳遞切片的元素作為不定參數
func printNumbers(n ...int) {
for _, number := range n {
fmt.Println(number)
}
}
不定參數提供了一個強大的工具,使函數能夠以更靈活的方式操作數據,特別是當你不知道將要處理的數據量時。
defer
在 Go 語言中,defer
關鍵字使得函數調用可以被延遲,直到包含該 defer
語句的函數即將結束時才執行。這通常用於進行清理操作,如關閉文件或釋放資源。
return
語句時,返回值已確定,但還沒有真正返回到調用函數。defer
語句都會按照先進後出(LIFO)的順序執行。defer
語句執行完畢後,函數才真正返回。defer
與返回值Go 的 return
語句並不是一個原子操作。其實,函數返回的具體步驟如下:
defer
語句。因此,defer
語句中的函數能夠修改返回值,使得最終的函數返回值與原始賦值不同。
func example() (result int) {
defer func() {
result++
}()
return 0
}
在上述例子中,即使 return 0
已設置返回值為 0,由於 defer
中的函數增加了返回值,所以 example()
最終返回 1。
為了更好地理解 defer
與返回值的關係,可以將 return
語句視為三個獨立的步驟:
defer
函數。return
操作。