1. 程式人生 > 其它 >Go語言基礎之函式引數

Go語言基礎之函式引數

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型別。

四、總結

  1. 函式引數定義

    func intSum(x int, y int) int {
        return x + y
    }
    
  2. 型別簡寫

    func intSum(x, y int) int {
        return x + y
    }
    
  3. 可變引數

    • 固定引數搭配可變引數使用時,可變引數要放在固定引數的後面
    • 可變引數通常要作為函式的最後一個引數
    func intSum(x ...int) int {
        fmt.Println(x) //x是一個切片
        sum := 0
        for _, v := range x {
            sum = sum + v
        }
        return sum
    }
    
  4. 可變長引數傳入切片

    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)
    }
    
    

在當下的階段,必將由程式設計師來主導,甚至比以往更甚。