GO的interface{}和any有什么区别?Go的接口和java的接口有什么区别?
答:
- interface{}和any没有任何区别
- 区别如下:
| Go | Java | |
|---|---|---|
| 实现方式 | 隐式实现 | 显示实现 |
| 代码耦合 | 松——定义接口的地方和使用接口的地方可以不在一个包 | 紧——类必须显示声明实现了哪个接口 |
GO语言并发题:下面这段代码会输出什么?有没有问题?
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
}()
for val := range ch {
fmt.Println(val)
}
fmt.Println("done")
}
问题: 会输出 0 1 2 3 4,然后死锁
原因:
ch := make(chan int) // 无缓冲 channel
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
// ⚠️ 这里没有 close(ch)!发送完就退出了
}()
for val := range ch { // range 会一直等 channel 被 close
fmt.Println(val)
}
// 到这里时,发送 goroutine 已退出,主 goroutine 还在等,
// 没有其他 goroutine 会往 ch 里写数据了 → 死锁
修复方式: 发送端发送完毕后主动 close
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch) // ✅ 发送完关闭,通知接收方结束
}()
for val := range ch {
fmt.Println(val)
}
fmt.Println("done") // ✅ 能执行到这里
}
原创
go基础学习一
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法