函数
图片来源:21|函数:请叫我“一等公民” (geekbang.org)
- 返回值列表:可返回多个值,可以带返回值名称,称具名返回值,defer函数常使用,使用具名返回值,return 后不需要加字段?
- 函数体在声明中可选,若没有函数体可能函数是Go语言之外实现的。
- 函数签名:参数列表和返回值列表,通常我们说函数签名时,会省去参数名与返回值变量名,只保留各自的类型信息
- 函数类型 func + 函数类型,可作为返回值。
匿名函数
类似于结构体初始化的符合字面值。
闭包
在函数内部创建的匿名函数,闭包也是一个函数。有外部函数内存的引用,所以可以访问创建它的函数的参数和局部变量。 用作函数返回值,介绍一次调用函数输入的参数。
func partialTimes(x int) func(int) int {
return func(y int) int {
return times(x, y)
}
}
sc := T{} //结构体复合字面值初始化
f := func(){} //匿名函数声明
浅/深拷贝
- 指针、map、切片都是类似一块内存的“引用”,拷贝时并没有拷贝实际的数据,而是固定大小的“引用”。
- 整型、数组、结构体,在内存中的表示就是实际数据,拷贝时开销和自身大小成正比(因为数组和结构体可能也会有指针)。
- 特例:形参为接口类型,Go编译器会把传递的实参赋值给对应的接口类型,变长参数会转化对对应长度
变长参数
底层原理就是切片
显示转换
A函数没有实现接口A’,但要作为实参传进某函数,可以通过显示转成相同类型的函数B,该B函数实现了A’接口,从而作为某函数的实参。