Golang函数

init函数


Golang中:

  1. 先初始化全局变量
  2. 执行init函数
  3. 执行main函数\
var t = test()

// init方法
func init()  {
     
	fmt.Println("init method...")
}
func test()int{
     
	fmt.Println("test methond")
	return 0
}
func main(){
     
	fmt.Println("main method")
}

// 输出结果
test methond
init method...
main method

init函数用来完成一些初始化操作

公有、私有


Golang中的变量、函数,如果以大写字母开头则是公有的,如果是小写字母开头。则是私有的。

匿名函数


如果某个函数只希望调用一次,那可以考虑使用匿名函数。匿名函数也可以多次调用。

示例:

	// 将结果直接赋值给变量
	result := func(n1,n2 int) int{
     
		return n1 + n2
	}(1,9)

	fmt.Println(result)

	// 将函数赋值给变量	
	f := func() {
     
		fmt.Println("匿名函数")
	}
	f()

全局匿名函数:将函数赋值给一个全局变量,此时匿名函数就成为了全局匿名函数

var Fun = func()string{
     
	return "sss"
}

闭包


闭包:一个函数和其相关引用环境组合的一个整体

func Add() func (int)int{
     
	// n 只会初始化一次
	n := 10
	return func(i int) int {
     
		n += i
		return n
	}
}

func main(){
     
	f := Add();
	fmt.Println(f(1))
	fmt.Println(f(2))
	fmt.Println(f(3))
	
	f2 := Add()
	fmt.Println(f2(1))
}
结果:
11
13
16

11
  • Add函数返回一个匿名函数,这个匿名函数和变量n组成闭包
  • 当我们反复调用f函数,n在f中只会初始化一次。后面调用会引用上次的值
  • 通过f2调用函数,f2中的n会初始化

defer


defer:在函数执行完成后,及时释放资源

func sum(n1,n2 int) int{
     
	// 当执行到defer时,会将defer修饰的语句压入独立的defer栈
	// 当函数执行完毕后,会按照先入后出的顺序出栈、执行
	defer fmt.Println("n1 = ",n1) //3
	defer fmt.Println("n2 = ",n2) // 2

	n1 ++
	n2 ++
	s := n1 + n2
	fmt.Println("s = ",s) // 1
	return s
}

func main(){
     
	res := sum(10,20)
	fmt.Println(res) // 4
}

控制台输出:
s =  32
// defer栈中的n1、n2不受后面代码的影响
n2 =  20
n1 =  10
32
  1. 当执行到defer时,会将defer修饰的语句压入独立的defer栈
  2. 当函数执行完毕后,会按照先入后出的顺序出栈、执行
  3. 当defer语句压入栈时,也会把值拷贝入栈

用来关闭资源。

值传递、引用传递

Golang中的两种传递方式:

  1. 值传递

    基本数据类型、数组、结构体

  2. 引用传递

    指针、切片、map、管道、interface

你可能感兴趣的:(Golang,Golang)