@ -0,0 +1,21 @@ | |||
# 主协程 🐖 🐑 🐩 🐈 | |||
每个Go程序启动的时候只有一个对用户可见的协程,称为主协程 | |||
当一个主协程退出后, 此程序也就退出了,即使还要一些其他协程在运行 | |||
# 协程返回值 | |||
一个协程调用的所有返回值(如果存在) 必须被全部舍弃 | |||
# waitGroup类型有三个方法 | |||
Add(用来注册新的需要完成的任务数), Done(用来通知某个任务完成了), Wait(此方法用来阻塞等待)到所有任务都已经完成后继续执行其后的语句 | |||
# defer延迟处理函数 | |||
和协程调用类似, 被延迟函数调用的所有返回值都必须全部舍弃 | |||
当一个函数调用被延迟后, 它不会立即被执行, 它将被推入由当前协程维护的一个延迟调用堆栈。 | |||
但一个函数调用返回并进入他的退出阶段,所有在此函数中已经被推入的延迟调用将按照它们被推入堆栈的逆顺序执行, | |||
当所有的延迟调用函数执行完毕之后,此函数调用也就真正的退出了 | |||
@ -1,2 +1,3 @@ | |||
1. 一般 print和println这两个内置函数并不推荐使用, 在正式的项目中,我们应该尽量使用fmt标准库包声明的相应函数 | |||
2. Go大括号 {} 来显示一个代码块 但是在Go中 { 不能放到下一行 这限制的好处(加快编译速度, 统一编程风格) | |||
2. Go大括号 {} 来显示一个代码块 但是在Go中 { 不能放到下一行 这限制的好处(加快编译速度, 统一编程风格) | |||
3. log标准库中的打印函数是经过了同步处理的, 而fmt标准库中的打印函数却没有被同步, 如果多协程中使用fmt打印则可能会交织在一起(概率性很低) |
@ -0,0 +1,21 @@ | |||
package main | |||
import ( | |||
"os" | |||
"strconv" | |||
"time" | |||
) | |||
func test(i int) { | |||
println("IMY***********", i) | |||
defer test(i*100000000000000000/137 + 11 + 253) | |||
} | |||
func main() { | |||
cnt, _ := strconv.Atoi(os.Args[1]) | |||
for i := 0; i < cnt; i++ { | |||
go test(1) | |||
} | |||
time.Sleep(120 * time.Second) | |||
} |
@ -0,0 +1,47 @@ | |||
package main | |||
import ( | |||
"os" | |||
"strconv" | |||
) | |||
func flib(index, max, l1, l2 int) int { | |||
if index == max { | |||
return l2 | |||
} | |||
return flib(index+1, max, l2, l1+l2) | |||
} | |||
func f(n int) int { | |||
if n == 0 { | |||
return 0 | |||
} else if n == 1 { | |||
return 1 | |||
} else { | |||
return f(n-1) + f(n-2) | |||
} | |||
} | |||
func main() { | |||
max, _ := strconv.Atoi(os.Args[1]) | |||
if max == 1 { | |||
println("index1: \n", max) | |||
println("value1: \n", 1) | |||
return | |||
} | |||
if max == 2 { | |||
println("index1: \n", max) | |||
println("value1: \n", 1) | |||
return | |||
} | |||
sum := flib(3, max, 1, 2) | |||
println("index1: ", max) | |||
println("value1: ", sum) | |||
sum = f(max) | |||
println("index2: ", max) | |||
println("value2: ", sum) | |||
} |
@ -0,0 +1,29 @@ | |||
package main | |||
import ( | |||
"log" | |||
"math/rand" | |||
"os" | |||
"strconv" | |||
"time" | |||
) | |||
func SayGreetings(greeting string, times int) { | |||
for i := 0; i < times; i++ { | |||
log.Println(greeting + " " + strconv.Itoa(i)) | |||
dur := time.Second * time.Duration(rand.Intn(5)) / 2 | |||
time.Sleep(dur) // 睡眠片刻 | |||
} | |||
} | |||
func main() { | |||
rand.Seed(time.Now().UnixNano()) | |||
log.SetFlags(0) | |||
cnt, _ := strconv.Atoi(os.Args[1]) | |||
for i := 0; i < cnt; i++ { | |||
go SayGreetings("Hi"+strconv.Itoa(i), 1000) | |||
} | |||
log.Println("the main over!!!") | |||
time.Sleep(time.Second * 1000000) | |||
} |
@ -0,0 +1,21 @@ | |||
package main | |||
import "time" | |||
func main() { | |||
println("hello world") | |||
go func() { | |||
time.Sleep(time.Second) | |||
//panic(123) | |||
}() | |||
defer func() { | |||
recover() | |||
}() | |||
println("IMY************") | |||
for { | |||
_ = new(int64) | |||
//time.Sleep(time.Second) | |||
} | |||
} |
@ -0,0 +1,36 @@ | |||
package main | |||
import ( | |||
"log" | |||
"math/rand" | |||
"os" | |||
"strconv" | |||
"sync" | |||
"time" | |||
) | |||
var wg sync.WaitGroup | |||
func SayGreetings(greeting string, times int) { | |||
for i := 0; i < times; i++ { | |||
log.Println(greeting + " " + strconv.Itoa(i)) | |||
dur := time.Second * time.Duration(rand.Intn(5)) / 2 | |||
time.Sleep(dur) // 睡眠片刻 | |||
} | |||
wg.Done() | |||
log.Println("green over !!!") | |||
} | |||
func main() { | |||
rand.Seed(time.Now().UnixNano()) | |||
log.SetFlags(0) | |||
cnt, _ := strconv.Atoi(os.Args[1]) | |||
wg.Add(cnt) | |||
for i := 0; i < cnt; i++ { | |||
go SayGreetings("Hi"+strconv.Itoa(i), 10) | |||
} | |||
wg.Wait() | |||
wg.Wait() | |||
log.Println("the main over!!!") | |||
} |