Go语言基础知识总结(持续中) (5)

当我们的一个函数返回值类型为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:

image-20210802160654350

两个很经典的例子 [参考博客](Go语言基础之函数 | 李文周的博客 (liwenzhou.com))

panic & recover & defer

image-20210802161948473

panic/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{ 字段名 字段类型 字段名 字段类型 ... }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwfxw.html