1、函数重载:
指的是可以编写多个同名函数,只要它们拥有不同的形参与/或者不同的返回值,在 Go 里面函数重载是不被允许的。
funcName redeclaredinthisbook, previous declaration at lineno
2、申明外部函数:
func flushICache(begin, end uintptr) // implemented externally
ep:
func make(Type,sizeIntegerType) Type //来自Go源码builtin.go
3、没有参数的函数通常被称为niladic函数(niladic function),就像main.main()。
4、传参方式:
1)按值传递:Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量。Function(arg1)
2)按引用传递:传递的是一个地址的副本,但是该地址副本和原地址指向的都是同一块内存,所以通过这个地址副本可以影响内存中的内容。Function(&arg1)
5、命名的返回值(推荐方式):
func A(input int) (x2 int, x3 int) {
x2 =2* input
x3 =3* input
// return x2, x3
return
}
6、空白符:
func ThreeValues() (a int, b int, c float32) {
a, b, c = 5, 6, 7
return
}
a,_,c :=ThreeValues() //这样就忽略了参数b。
7、传递变长参数:
func myFunc(a, b string, elems ...int) {
fmt.Printf("%T ",elems) //[]int , 即:elems是一个切片类型
fmt.Println(a, b, elems) //lxc zhuoer [1 2 3 4 5 6]
}
myFunc("lxc", "zhuoer", 1,2,3,4,5,6)
注意: elems如果是放在一个切片(sl)中要传递过来的话, 则可以使用 sl... 方式来传递。
sl := []int{1,2,3,4,5,6};
myFunc("lxc","zhuoer", sl... )
8、defer:
作用:允许我们推迟到函数返回之前(或任意位置执行return语句之后)一刻才执行某个语句或函数。
func A () {
fmt.Println("AAAAAAA")
defer fmt.Println("BBBBBBBB")
fmt.Println("CCCCCCC")
}
输出:
AAAAAAAA
CCCCCCC
BBBBBBBB
特别注意:
for i :=0; i <4; i++ {
defer func() {
fmt.Print(i)
}()
}
输出:
4444 //个人理解:defer 只是暂时注册了这些匿名函数,并没有执行匿名函数的函数体,所以fmt.Println(i)这条语句没有执行,所以也就没有发生值拷贝,当真正需要执行的时候,i已经变为4了,此时发生的值拷贝也是拷贝的4.
for i :=0; i <4; i++ {
defer fmt.Print(i)
}
输出:
3210
9、计算函数执行的时间:
start := time.Now()
longCalculation()
end := time.Now()
delta := end.Sub(start) //delta执行时间,毫秒