速戰速決 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