Golang 函式
阿新 • • 發佈:2020-08-07
Golang 函式
目錄
基本語法
func 函式名 (形參列表) 返回值{
//body
return 返回值
}
-
不帶返回值
func say(str string){ fmt.Println(str) } say("world")
-
帶單個返回值
func Hello(a int32, b int32) int32{ return a+b } hello := Hello(10, 20)
-
帶多個返回值
func number(a int, b int) (int, int) { return a, b } a, b := number(10, 20) c,_ := number(10,30) // _ 表示忽略返回的值
-
回撥函式
//作為引數 func test1(num1 int, num2 int) int { return num1 + num2 } //和Js中呼叫回撥函式相同 func test2(method func(int, int) int, a int, b int) int { return method(a, b) } func main() { i := test2(test1, 10, 20) fmt.Println(i) }
-
閉包
無返回值
func test2(a int, b int) func() { return func() { fmt.Println(a+b) } } func main() { f := test2(10, 20) f() }
有返回值
func test2(a int, b int) func(string) { return func(s string) { fmt.Println(s) fmt.Println(a+b) } } func main() { //作為返回值 f := test2(10, 20) f("hello world") }
注意事項
-
函式的形參列表可以是多個,返回值列表也可以是多個。
-
形參列表和返回值列表的資料型別可以是值型別和引用型別。
-
函式的命名遵循識別符號命名規範,首字母不能是是數字,首字母大寫該函式可以被本包檔案和其他包檔案使用,類似於
public
private
-
函式中的變數是區域性的,函式外不生效
-
基本資料型別和陣列預設都是值傳遞,即進行值拷貝。在函式內修改,不會影響到原來的值
-
如果希望函式內的變數能修改函式外的變數(指的是預設以值傳遞的方式的資料型別),可以傳入變數的地址
&
,函式內以指標的方式操作變數。func test(a *int)*int{ *a = 30 //使用指標訪問地址 return a } i := 20 test(&i) fmt.Println(i)//30
-
Go函式不支援過載
-
函式也是一種資料型別
func test(a int,b int)int{ return a+b } func main() { //和Js中相似, 函式是reference a := test fmt.Println(a(30 ,50))// 呼叫函式 fmt.Printf("a的型別為%T",a) fmt.Printf("test的型別為%T",test) }
-
支援對函式返回值命名
func method(a uint32, b uint32) (res uint32, tmp int) { res = a + b //自動返回res tmp = int(a+b) return } func main() { res, tmp := method(10, 10) //相當於Java System.err.print() print(res,tmp) }
-
使用
_
表示符,忽略返回值func main() { //忽略返回值中err num, _ := strconv.ParseInt("110", 2, 64) fmt.Println(num) }
-
支援可變引數
args
是slice
切片,通過args[index]
可以訪問到各個值- 如果一個函式的形參列表中有可變引數,則可變引數需要放在列表的最後
//本質是切片,和Js中相似 func function(args... int){ fmt.Println("args = ",args) fmt.Println("len = ",len(args))//本質是一個數組 for i := 0; i < len(args); i++ { fmt.Printf("args[%d] = %d \t",i,args[i]) } } func main() { function(1,2,3,4) }