当我们的一个函数返回值类型为slice时,nil可以看做是一个有效的slice,没必要显示返回一个长度为0的切片。
func someFunc(x string) []int { if x == "" { return nil // 没必要返回[]int{} } ... } 全局变量在函数外定义的变量,函数内可以访问到全局变量
局部变量在函数内定义的变量,只能在函数内访问得到。
注意:
如果局部变量和全局变量成名,有限访问局部变量。
定义函数类型 type 函数类型 func(int ,int) int 函数作为参数 package main import "fmt" func add(x, y int) int { return x + y } func calc(x, y int, op func(int, int) int) int { return op(x, y) } func main() { ret2 := calc(10, 20, add) fmt.Println(ret2) } 函数作为返回值 func do(s string) (func(int, int) int, error) { switch s { case "+": return add, nil case "-": return sub, nil default: err := errors.New("无法识别的操作符") return nil, err } } 匿名函数匿名函数就是没有名字的函数,可以把函数赋值给变量,也可以把函数作为返回值。
func(参数)(返回值){ 函数体 }匿名函数没有办法像普通函数那样子调用,他需要保存在某一个变量中(就是赋值),然后在执行。
package main import "fmt" func test() { func () { fmt.Println("匿 名 函 数") }() } func main() { test() }匿名函数执行:
func test() { func () { fmt.Println("匿 名 函 数") }()//在后面加上括号就相当于执行 }或者赋值:
package main import "fmt" func test() func() { return func() { fmt.Println("匿 名 函 数") } } func main() { r := test() r() } 闭包闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境。
package main import "fmt" //闭包简单示例 //闭包概念 闭包=函数+外层变量的引用 func test() func() { name := "A2rcher" return func() { fmt.Println("匿 名 函 数",name) // 如果在匿名函数中找不到调用的变量,他就会向外层去找 } //这个外层变量并不是全局变量,而是函数test()中的局部变量 } func main() { r := test() // r引用了函数test()中的变量还有匿名函数 ,可以说r此时就是一个闭包 r() }闭包还可以这么写(比较典型的一个例子)
package main import "fmt" //闭包简单示例 //闭包概念 闭包=函数+外层变量的引用 func test(name string) func() { return func() { fmt.Println("匿 名 函 数", name) } } func main() { r := test("A2rcher") r() }example:
两个很经典的例子 [参考博客](Go语言基础之函数 | 李文周的博客 (liwenzhou.com))
panic & recover & deferpanic/recover:可以理解为异常处理模式(但是Go语言中并没有异常处理机制,只是这样方便理解),
package main import "fmt" //panic and recover func a() { fmt.Println("func is a") } //recover必须配合defer使用,而且defer一定要在panic前定义。 func b() { defer func() { err := recover() if err != nil { //如果err不等于nil,说明这个程序出错 fmt.Println("func b is err ") } }() panic("func is b") } func c() { fmt.Println("func is c") } func main() { a() b() c() }程序运行期间funcB中引发了panic导致程序崩溃,异常退出了。这个时候我们就可以通过recover将程序恢复回来,继续往后执行。
内置函数 内置函数 介绍close 主要用来关闭channel
len 用来求长度,比如string、array、slice、map、channel
new 用来分配内存,主要用来分配值类型,比如int、struct。返回的是指针
make 用来分配内存,主要用来分配引用类型,比如chan、map、slice
append 用来追加元素到数组、slice中
panic和recover 用来做错误处理
指针
Go语言中指针没有偏移跟运算,只需要搞清楚三个概念和记住两个符号:指针地址,指针类型,指针取值,&(取地址)和*(根据地址取值)。。
贴个链接吧,大佬还是大佬
结构体 类型别名和自定义类型type定义关键字类型
type myInt int //将myInt定义成int类型 结构体定义 type 类型名 struct{ 字段名 字段类型 字段名 字段类型 ... }