golang常见编程错误集
2024-09-07 17:53:10
一、append是深拷贝,
func main() {
a := []int{7, 8, 9}
fmt.Printf("%+v\n", a)
ap(a)
fmt.Println("==", a)
app(a)
fmt.Println("-a-a", a) }
func ap(a []int) {
a = append(a, 10)
} func app(a []int) {
a[0] = 1
}
二、waitgroup用法
package main import (
"fmt"
"runtime"
"sync"
) func main() {
runtime.GOMAXPROCS(1)
wg := sync.WaitGroup{}
wg.Add(20)
for i := 0; i < 10; i++ {
go func() {
fmt.Println("i=", i)
wg.Done()
}()
}
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println("i=", i)
wg.Done()
}(i)
}
wg.Wait()
}
三、通道误用示例
// demo1 通道误用导致的bug
func demo1() {
wg := sync.WaitGroup{} ch := make(chan int, 10)
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) wg.Add(3)
for j := 0; j < 3; j++ {
go func() {
for {
task := <-ch
// 这里假设对接收的数据执行某些操作
fmt.Println(task)
}
wg.Done()
}()
}
wg.Wait()
}
解析:将上述代码编译执行后,匿名函数所在的 goroutine 并不会按照预期在通道被关闭后退出。因为task := <- ch
的接收操作在通道被关闭后会一直接收到零值,而不会退出。此处的接收操作应该使用task, ok := <- ch
,通过判断布尔值ok
为假时退出;或者使用select 来处理通道
最新文章
- 论文笔记(1)——《Where&#39;s Wally?Precise User Discovery Attacks in Location Proximity Services》
- IntelliJ IDEA 的 20 个代码自动完成的特性
- 核心动画(CAKeyframeAnimation)
- 注册asp.net 4.0 到iis
- jquery图片时钟
- 译:Google的大规模集群管理工具Borg(一)------ 用户视角的Borg特性
- Android学习笔记03-搭建Win8下的Android开发环境
- Sql Server 检测死锁的SQL语句
- webservice cxf error:org.apache.cxf.interceptor.Fault: Unmarshalling Error: 意外的元素 (uri:";";, local:";ca
- SCU 4440 分类: ACM 2015-06-20 23:58 16人阅读 评论(0) 收藏
- Windows进程
- IPython,让Python显得友好十倍的外套——windows XP/Win7安装详解
- 改变TPageControl的活动标签颜色
- English - 被动语态的翻译原则
- activemq的安装与使用
- bzoj 1705;poj 3612:[Usaco2007 Nov]Telephone Wire 架设电话线
- jQuery 事件 - ready() 方法
- React Router基础教程
- [LOJ6261]一个人的高三楼
- C# Winform下一个热插拔的MIS/MRP/ERP框架12(数据处理基类)