Go 里面有三种类型的函数:

1.普通的带有名字的函数

2.匿名函数或者lambda函数

3.方法

 

函数重载(function overloading)指的是可以编写多个同名函数,只要它们拥有不同的形参与/或者不同的返回值,在 Go 里面函数重载是不被允许的。这将导致一个编译错误:

funcName redeclared in this book, previous declaration at lineno

 

函数也可以以申明的方式被使用,作为一个函数类型,就像:

type binOp func(int, int) int // 类型

 

按值传递和按引用传递

Go 默认使用按值传递来传递参数,也就是传递参数的副本。使用变量的过程中可能对副本的值进行更改,不会影响到原来的变量

如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(指针或引用)(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递,我们可以通过这个指针的值来修改这个值所指向的地址上的值。(译者注:指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址)

按引用传递我觉得也是按值传递,只是这个值是引用的内存地址.

几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。

在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。

 

函数返回值

()(int, int)
()

尽量使用命名返回值:会使代码更清晰、更简短,同时更加容易读懂。

 

空白符

空白符用来匹配一些不需要的值,然后丢弃掉。通常多返回值时使用,比如list在range循环时,index,value 这时 可以不要index,而采用空白符  _,value

 

变长参数

...type
 func myFunc(a, b, arg ...int) {}
arrarr...
 arr := []int{7,9,3,5,1}
 x = dosomething(arr...)

 

defer

return
finally

当有多个 defer 行为被注册时,它们会以逆序执行(类似栈,即后进先出)

使用 defer 的语句同样可以接受参数,并且变量内容是在代码顺序执行到defer时的值,defer只是把调用押后,但是赋值时还是按代码顺序运行到defer是变量的值