小总结
//并发处理
go func() {....}()
//goto语句 代码中随意跳动 不要混淆
goto xxxx
//匿名函数就是一次性执行一批代码
func() {....}()
//匿名有参数有返回数值的函数
func (声明传值) (声明返回值) {...}(实际调用传值)
//go和匿名函数配合可以作为 并发执行代码功能。
go func() {....}()
//defer和func配合可以 延迟执行一段代码。
defer func() {....}()
匿名函数
类似一次性塑料袋
没有起名字的必要
没有复用的价值
但是又有必要封装起来用一次
defer匿名函数
1 package main
2
3 import "fmt"
4
5 func main() {
6
7 defer fmt.Println("我是倒数第一")
8 //本来应该是func(){..}() 但是因为里面的内容都是defer的 所以整体defer了匿名func
9 defer func() {
10 //封装在一起,内部是顺序的
11 fmt.Println("我是倒数第二")
12 fmt.Println("我是倒数第三")
13 fmt.Println("我是倒数第四")
14
15 }()
16
17 }
18 /*
19 我是倒数第二
20 我是倒数第三
21 我是倒数第四
22 我是倒数第一
23 */
并发一段代码
package main
import (
"fmt"
"time"
)
func main() {
//并发执行一段代码,go中代码跑在子协助里
go func() {
fmt.Println("哈哈哈哈哈222")
time.Sleep(1*time.Second)
fmt.Println("嘎嘎嘎嘎222")
time.Sleep(1*time.Second)
fmt.Println("嘻嘻嘻嘻嘻2222")
time.Sleep(1*time.Second)
}()
//以下代码跑在主【协程/微现成】里
//主协程死了,子协程也会跟着挂.
fmt.Println("哈哈哈哈哈1111")
time.Sleep(1*time.Second)
fmt.Println("嘎嘎嘎嘎1111")
time.Sleep(1*time.Second)
fmt.Println("嘻嘻嘻嘻嘻1111")
time.Sleep(1*time.Second)
}
/*
哈哈哈哈哈1111
哈哈哈哈哈222
嘎嘎嘎嘎222
嘎嘎嘎嘎1111
嘻嘻嘻嘻嘻2222
嘻嘻嘻嘻嘻1111
*/
带有参数和返回值的匿名函数
1 //解释
2 func (声明传值) (声明返回值) {
3 ....
4 }(实际调用传值)
5
6
7
8
9 //普通的有名有参数的函数
10 package main
11
12 import "fmt"
13
14 func test(name string, age int) (renpin int) {
15 renpin = 100
16 return
17 }
18
19 func main() {
20 renpin := test("张三", 10)
21 fmt.Println(renpin)
22 }
23 /*
24 100
25 */
26
27
28 //转换成匿名函数
29 package main
30
31 import "fmt"
32
33 func main() {
34
35 fmt.Println(
36 func(name string, age int) (renpin int) {
37 renpin = 100
38 return
39 }("张三", 10))
40 }
41 /*
42 100
43 */