go-function函数

函数function

  • go函数不支持嵌套、重载和默认参数
  • 支持以下特性
  • 无需声明原型、不定长度变参、多返回值、命名返回值参数
  • 匿名函数、闭包
  • 定义函数使用关键字func,且左大括号不能另起一行
  • 函数也可以作为一种类型使用
package main

import (
	"fmt"
)

func main()  {
	a,b := 1,2
	A(a,b)
	fmt.Println(a,b)
}

func A(s ... int) (a,b,c int)  {
	s[0] = 3   //值类型传递是值的拷贝,指针类型是地址的拷贝
	s[1] = 4
	fmt.Println(s)    //...为不定长变参,前面的变量为slice,注意:不变长变参必须放最后
	a,b,c = 1,2,3
	return  //如果函数定义了命名返回值变量,可以直接使用ruturn
}

匿名函数与闭包

package main

import (
	"fmt"
)

func main()  {
	a := func() {
		fmt.Println("FUNC A")
	}
	a()

	f := closure(10)   //调用闭包外层函数,返回匿名函数
	fmt.Println(f(1))   //11
	fmt.Println(f(3))   //13
}
//闭包
func closure(x int) func(int) int  {
	fmt.Println("%o\n",&x)
	return func(y int) int {
		fmt.Println("%p\n",&x)
		return x+y
	}
}

defer

  • 执行方式类似其他语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行
  • 即时函数发生严重错误也会执行
  • 支持匿名函数的调用
  • 常用语资源清理、文件关闭、解锁以及记录时间等操作
  • 通过与匿名函数配合可在return之后修改函数计算结果
  • 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则则是引用某个变量的地址
  • go没有异常机制,但又panic/recover模式来数理错误
  • panic可以在任何地方引发,但recover只有在defer调用的函数中有效
package main

import (
	"fmt"
)

func main()  {
	for i := 0; i<3 ;i++{
		defer fmt.Println(i)    //2 1 0
	}
	for i := 0; i<3 ;i++{
		defer func() {
			fmt.Println(i)     //3 3 3   对i的引用,当main函数结束的时候,i已经为3
		 }()   //尾部加()代表调用
		}
	fmt.Println("a")
	defer fmt.Println("b")
	defer fmt.Println("c")
}

  

package main

import (
	"fmt"
)

func main()  {
	A()
	B()
}

func A()  {
	fmt.Println("FUNC A")
}

func B()  {
	defer func() {
		if err := recover();err != nil{      //恢复到正常状态
			fmt.Println("RECOVER IN B")
			C()
		}
	}()    //由于程序遇到panci程序不再往下执行,所以要在panic之前注册recover
	panic("Panic in B")    //这里往下程序不再执行

}

func C()  {
	fmt.Println("FUNC C")
}

  

 

posted @ 2017-09-02 22:19  amchen  阅读(764)  评论(0编辑  收藏  举报