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是变量的值