特点
无需声明原型
支持不定变参
支持多返回值
支持命名返回参数
支持匿名函数和闭包 函数也是一种类型,一个函数可以赋值给变量
不支持 嵌套 (nested) 一个包不能有两个名字一样的函数
不支持 重载 (overload)
不支持 默认参数 (default parameter)。
函数定义
func function_name( [parameter list] ) [return_types] {
函数体
}
// 不定参数
func myfunc(args ...int) { //0个或多个参数
}
func add(a int, args…int) int { //1个或多个参数
}
匿名函数
n := func(a int) int {
a++
return a
}
fmt.Println(n(1))
碰巧匿名函数与上了切片
fns := [](func(x int) int){
func(x int) int { return x + 1 },
func(x int) int { return x + 2 },
}
println(fns[0](100))
闭包
func main() {
test()()
}
func test() func() {
return func() {
fmt.Println("test func ()")
}
}
// 需要注意如下代码
func a() func() {
i := 0
b := func() {
i++
fmt.Println(i)
}
return b
}
func main() {
c := a()
c()
c()
}
defer 和panic
defer特性
1.关键字 defer 用于注册延迟调用。
2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。
3. 多个defer语句,按先进后出的方式执行。
4. defer语句中的变量,在defer声明时就决定了。
defer用途
1.关闭文件句柄
2. 锁资源释放
3. 数据库连接释放
panic用途
1、内置函数
2、假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行
3、返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行
4、直到goroutine整个退出,并报告错误
结构体
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
结构体嵌套
//address 地址结构体
type address struct {
city string
}
//User 用户结构体
type user struct {
name string
sex string
addr address //匿名结构体
}
结构体继承
type User struct {
Name string
Sex string
}
type Teacher struct {
user User
}
type Manger struct {
User
}
结构体方法
类型 T 方法集包含全部 receiver T 方法。
类型 *T 方法集包含全部 receiver T + *T 方法。
如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。
如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T + *T 方法。
不管嵌入 T 或 T,S 方法集总是包含 T + *T 方法。