速戰速決 go - go 面向對象: 函數(函數基礎,帶變量名的返回值,多返回值,可變參數,傳參時指針和非指針的區別)

速戰速決 go https://github.com/webabcd/GoSample
作者 webabcd

速戰速決 go - go 面向對象: 函數(函數基礎,帶變量名的返回值,多返回值,可變參數,傳參時指針和非指針的區別)

示例如下:

oop/function1.go

// go 面向對象 - 函數(函數基礎,帶變量名的返回值,多返回值,可變參數,傳參時指針和非指針的區別)

package oop

import "fmt"

func Function1Sample() {
	function1_sample1()
	function1_sample2()
	function1_sample3()
}

func function1_sample1() {
	// 調用函數
	a := func11(0, "a", "b")
	fmt.Println(a) // 0ab

	// 調用函數
	b := func12()
	fmt.Println(b) // 100

	// 調用函數(此函數有多個返回值)
	c1, c2, c3 := func13()
	fmt.Println(c1, c2, c3) // 0 a true
}

// 定義一個函數
// 參數 a 是 int 類型,參數 b 和 c 是 string 類型,返回值是 string 類型
func func11(a int, b, c string) string {
	return fmt.Sprint(a, b, c)
}

// 爲函數定義一個帶有變量名的返回值
func func12() (x int) {
	// 變量會用默認值初始化
	fmt.Println(x) // 0
	x = 100

	// 直接 return 返回的就是你上面定義的返回值的變量名
	return
	// 也可以 return 指定數據的
	// return x
}

// 函數支持多返回值
func func13() (int, string, bool) {
	return 0, "a", true
}

func function1_sample2() {
	// 調用帶有可變參數的函數(可變參數爲 int 類型的可變參數)
	func14("webabcd", 0, 1, 2)

	// 調用帶有可變參數的函數(可變參數爲任意類型的可變參數)
	func15(0, "a", true)
}

// 函數支持可變參數,可變參數要放到其他參數的後面
// 下面的函數定義了一個 int 類型的可變參數
func func14(a string, args ...int) {
	fmt.Println(a)
	// 遍歷可變參數
	for _, arg := range args {
		fmt.Println(arg)
	}
}

// 下面的函數定義了一個任意類型的可變參數
func func15(args ...interface{}) {
	// 將可變參數傳給其他函數時要注意參數名後面要跟 ...
	func16(args...)
}

// 下面的函數定義了一個任意類型的可變參數
func func16(args ...interface{}) {
	// 遍歷可變參數
	for _, arg := range args {
		// 獲取當前遍歷出的參數的數據類型
		switch arg.(type) { // 這個是接口的類型斷言
		case int:
			fmt.Println(arg, "int")
		case string:
			fmt.Println(arg, "string")
		case bool:
			fmt.Println(arg, "bool")
		}
	}
}

// 本例由於演示傳參時指針和非指針的區別
func function1_sample3() {
	a, b := 0, 0
	c := &b
	fmt.Printf("%d, %d, %p, %p, %p\n", a, b, &a, &b, &c) // 0, 0, 0xc0000140c0, 0xc0000140c8, 0xc000006030
	func17(a, &b)
	fmt.Printf("%d, %d, %p, %p, %p\n", a, b, &a, &b, &c) // 0, 1, 0xc0000140c0, 0xc0000140c8, 0xc000006030
}

// 無論實參是非指針還是指針,形參都會複製實參,然後在函數中使用
// 實參是非指針,則形參會複製實參,然後在函數中使用,所以函數中對形參的操作不會影響到實參
// 實參是指針,則形參會複製實參(也就是說形參指向的值和實參指向的值是同一個),然後在函數中使用,所以函數中對形參指向的值做操作就是對實參指向的值做操作
func func17(a int, b *int) {
	// 注意:這裏實參 b 和形參 b 本身保存的值(這個保存的值是一個指針)是相同的,但是實參 b 的指針和形參 b 的指針是不同的(也就是說不管是不是指針,形參都會將實參複製出一份並使用)
	fmt.Printf("%d, %d, %p, %p, %p\n", a, *b, &a, b, &b) // 0, 0, 0xc0000140d0, 0xc0000140c8, 0xc000006038
	a = 1
	*b = 1
	fmt.Printf("%d, %d, %p, %p, %p\n", a, *b, &a, b, &b) // 1, 1, 0xc0000140d0, 0xc0000140c8, 0xc000006038
}

速戰速決 go https://github.com/webabcd/GoSample
作者 webabcd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章