1. 程式人生 > 實用技巧 >Golang 函式

Golang 函式

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

注意事項

  1. 函式的形參列表可以是多個,返回值列表也可以是多個。

  2. 形參列表和返回值列表的資料型別可以是值型別和引用型別。

  3. 函式的命名遵循識別符號命名規範,首字母不能是是數字,首字母大寫該函式可以被本包檔案和其他包檔案使用,類似於public

    ,首字母小寫,只能被本包檔案使用,其他包檔案不能使用,類似private

  4. 函式中的變數是區域性的,函式外不生效

  5. 基本資料型別陣列預設都是值傳遞,即進行值拷貝。在函式內修改,不會影響到原來的值

  6. 如果希望函式內的變數能修改函式外的變數(指的是預設以值傳遞的方式的資料型別),可以傳入變數的地址&,函式內以指標的方式操作變數。

    func test(a *int)*int{
    	*a = 30 //使用指標訪問地址
    	return a
    }
    i := 20
    test(&i)
    fmt.Println(i)//30
    
  7. Go函式不支援過載

  8. 函式也是一種資料型別

    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)
    }
    
  9. 支援對函式返回值命名

    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)
    }
    
  10. 使用_表示符,忽略返回值

    func main() {
    	//忽略返回值中err
    	num, _ := strconv.ParseInt("110", 2, 64)
    	fmt.Println(num)
    }
    
  11. 支援可變引數

    • argsslice切片,通過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)
    }