Go有意思小问题汇集

简介: Go有意思小问题汇集

有缓冲的channel没有读完,close后还能继续读出里面的内容吗?


可以!

读取多次可以依次拿到之前写入的值,直到最后读完,继续读则得到对应channel类型的0值

package main
import (
  "fmt"
)
func main() {
  ch := make(chan int, 3)
  fmt.Println(ch)
  ch <- 123
  ch <- 456
  close(ch)
  fmt.Println("从已关闭的channel中读取到信息为:", <-ch)
  fmt.Println("从已关闭的channel中读取到信息为:", <-ch)
  fmt.Println("从已关闭的channel中读取到信息为:", <-ch)
}
0x14000134000
从已关闭的channel中读取到信息为: 123
从已关闭的channel中读取到信息为: 456
从已关闭的channel中读取到信息为: 0

golang之channel入门

channel需要注意的点:

  • 关闭一个nil channel 会导致程序panic
  • channel关闭之后,仍然可以从channel中读取剩余的数据,直到数据全部读取完成。读取完后继续读,得到的将是对应类型的零值.
  • 而如果继续向已关闭的channel发送数据,会引起panic
  • channel不能关闭两次,否则会panic


A->B->C三个祖孙协程,B耗时最短,B执行结束后,C还会继续执行吗?


Go中父协程与子协程的生命周期问题

结论:

1. 当父协程是main协程时,父协程退出,父协程下的所有子协程也会跟着退出; (当main协程结束时,子协程也是会被终止掉的)

package main
import (
  "fmt"
)
func main() {
  fmt.Println(123)
  go func() {
    panic("子协程中发生异常")
  }()
  fmt.Println(456)
  //time.Sleep(3e9)
}

输出:

123
456

2. 当父协程不是main协程时,父协程退出,父协程下的所有子协程并不会跟着退出(子协程直到自己的所有逻辑执行完或者是main协程结束才结束)

package main
import (
  "fmt"
  "time"
)
func main() {
  fmt.Println(123)
  go f1()
  fmt.Println(456)
  time.Sleep(5e9)
}
func f1() {
  go func() {
    time.Sleep(4e9)
    fmt.Println("但f1()创建的协程还在像子弹一样继续飞!")
    panic("子协程中发生异常")
  }()
  time.Sleep(2e9)
  fmt.Println("f1()执行结束")
}
123
456
f1()执行结束
但f1()创建的协程还在像子弹一样继续飞!
panic: 子协程中发生异常
goroutine 33 [running]:
main.f1.func1()
        /Users/fliter/go/src/shuang/0000/panic.go:25 +0x7c
created by main.f1
        /Users/fliter/go/src/shuang/0000/panic.go:22 +0x24
exit status 2

go中父协程与子协程的生命周期(子协程能否使用主协程变量)


子协程panic,主协程还能不能正常运行? 主协程里的recover,能捕获子协程的panic吗?


不能

package main
import (
  "fmt"
  "time"
)
func main() {
  fmt.Println(123)
  go func() {
    panic("子协程中发生异常")
  }()
  fmt.Println(456)
  time.Sleep(3e9)
}
123
456
panic: 子协程中发生异常
goroutine 4 [running]:
main.main.func1()
        /Users/fliter/go/src/shuang/0000/panic.go:14 +0x2c
created by main.main
        /Users/fliter/go/src/shuang/0000/panic.go:12 +0x64
exit status 2

主协程里的recover,能捕获子协程的panic吗?

不能~

对于goroutine中的panic,协程外面的recover是无法恢复的;goroutine中的recover,同样无法恢复协程外的panic

Go异常处理机制panic和recover


recover哪些情况下阻止不了程序崩溃?


不能~

  • 并发读写 map
  • 堆栈内存耗尽(如递归)
  • 将 nil 函数作为 goroutine 启动
  • goroutines 死锁
  • 线程限制耗尽
  • 超出可用内存

会报fatal error:xxxxxxxx

recover能捕获所有错误吗?

目录
相关文章
|
5月前
|
SQL 关系型数据库 测试技术
技术经验分享:Go开源项目
技术经验分享:Go开源项目
42 0
|
3月前
|
Go API 开发工具
我的业务不一样,用 go-zero 怎么搞?
我的业务不一样,用 go-zero 怎么搞?
|
3月前
|
安全 Ubuntu 测试技术
庆祝 Go 开源发布十四周年!
庆祝 Go 开源发布十四周年!
|
3月前
|
安全 Java Go
最新进展:Go arena 手动管理内存,鸽了!
最新进展:Go arena 手动管理内存,鸽了!
|
6月前
|
Java Linux Go
关于我想写一个Go系列的这件事
本文是Go语言专栏的开篇,作者sharkChili分享了他对Go语言的喜爱,并简要介绍了如何在Windows和Linux上搭建Go环境。文章包括下载安装包、解压、配置环境变量等步骤。此外,还展示了编写并运行第一个&quot;Hello, sharkChili&quot;的Go程序。最后提到了Go项目的`.gitignore`文件示例,并鼓励读者关注作者的公众号以获取更多Go语言相关的内容。
40 0
|
Java 编译器 Go
为何每个开发者都在谈论Go?1
为何每个开发者都在谈论Go?
113 0
|
Kubernetes Cloud Native Go
为何每个开发者都在谈论Go?2
为何每个开发者都在谈论Go?
93 0
|
编译器 Go Windows
Go知识梳理
快速学习Go知识梳理
Go知识梳理
|
程序员 Go
Go 程序员的演变,最后的 “Rob Pike” 这个梗看懂了吗?
Go 程序员的演变,最后的 “Rob Pike” 这个梗看懂了吗?
|
Rust 安全 JavaScript
Go 核心团队 Russ Cox "驳斥"AWS 博文作者 :对 Go 存在严重误导!
Go 核心团队 Russ Cox "驳斥"AWS 博文作者 :对 Go 存在严重误导!
116 0
Go 核心团队 Russ Cox "驳斥"AWS 博文作者 :对 Go 存在严重误导!
下一篇
无影云桌面