可能會遇到的雷點
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 操作。