Go語言基礎之函式引數
阿新 • • 發佈:2021-10-16
Go語言基礎之函式引數
一、型別簡寫
函式的引數中如果相鄰變數的型別相同,則可以省略型別,例如:
func intSum(x int, y int) int {
return x + y
}
// 函式引數簡寫
func intSum(x, y int) int {
return x + y
}
上面的程式碼中,intSum
函式有兩個引數,這兩個引數的型別均為int
,因此可以省略x
的型別,因為y
後面有型別說明,x
引數也是該型別。
二、可變引數
可變引數是指函式的引數數量不固定。Go語言中的可變引數通過在引數名後加...
來標識。
注意:可變引數通常要作為函式的最後一個引數。
舉個例子:
func intSum(x ...int) int {
fmt.Println(x) //x是一個切片
sum := 0
for _, v := range x {
sum = sum + v
}
return sum
}
呼叫上面的函式:
ret1 := intSum()
ret2 := intSum(10)
ret3 := intSum(10, 20)
ret4 := intSum(10, 20, 30)
fmt.Println(ret1, ret2, ret3, ret4) //0 10 30 60
固定引數搭配可變引數使用時,可變引數要放在固定引數的後面,示例程式碼如下:
func intSum1(x int, y ...int) int {
fmt.Println(x, y)
sum := x
for _, v := range y {
sum = sum + v
}
return sum
}
呼叫上述函式:
ret5 := intSum1(100)
ret6 := intSum1(100, 10)
ret7 := intSum1(100, 10, 20)
ret8 := intSum1(100, 10, 20, 30)
fmt.Println(ret5, ret6, ret7, ret8) //100 110 130 160
本質上,函式的可變引數是通過切片來實現的。
三、可變長引數傳入切片
func main() {
a := []int{1, 2, 3, 4}
// test4(a) //不可以
test(a...) //相當於打散了,對資料型別有要求,也就是a必須是int型別切片才能打散了傳過去
}
func test(a ...int) {
//a是切片,但是不能直接傳切片
//如果想直接傳切片,可以嗎?
fmt.Println(a)
//檢視變數a的型別(切片型別)
fmt.Printf("%T",a)
}
[1 2 3 4]
[]int
由可變引數函式的定義可知,a...int
意味它可以接受 int
型別的可變引數。
在上面程式,a作為可變引數傳入 test
函式。前面我們知道,這些可變引數引數會被轉換為 int
型別切片然後在傳入 test
函式中。但是在這裡 a
已經是一個 int 型別切片,編譯器試圖在 a
基礎上再建立一個切片,像下面這樣
test(89, []int{nums})
這裡之所以會失敗是因為 nums
是一個 []int
型別 而不是 int
型別。
四、總結
-
函式引數定義
func intSum(x int, y int) int { return x + y }
-
型別簡寫
func intSum(x, y int) int { return x + y }
-
可變引數
- 固定引數搭配可變引數使用時,可變引數要放在固定引數的後面
- 可變引數通常要作為函式的最後一個引數
func intSum(x ...int) int { fmt.Println(x) //x是一個切片 sum := 0 for _, v := range x { sum = sum + v } return sum }
-
可變長引數傳入切片
func main() { a := []int{1, 2, 3, 4} // test4(a) //不可以 test(a...) //相當於打散了,對資料型別有要求,也就是a必須是int型別切片才能打散了傳過去 } func test(a ...int) { //a是切片,但是不能直接傳切片 fmt.Println(a) //檢視變數a的型別(切片型別) fmt.Printf("%T",a) }
在當下的階段,必將由程式設計師來主導,甚至比以往更甚。