一、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. 论文笔记(1)——《Where&#39;s Wally?Precise User Discovery Attacks in Location Proximity Services》
  2. IntelliJ IDEA 的 20 个代码自动完成的特性
  3. 核心动画(CAKeyframeAnimation)
  4. 注册asp.net 4.0 到iis
  5. jquery图片时钟
  6. 译:Google的大规模集群管理工具Borg(一)------ 用户视角的Borg特性
  7. Android学习笔记03-搭建Win8下的Android开发环境
  8. Sql Server 检测死锁的SQL语句
  9. webservice cxf error:org.apache.cxf.interceptor.Fault: Unmarshalling Error: 意外的元素 (uri:&quot;&quot;, local:&quot;ca
  10. SCU 4440 分类: ACM 2015-06-20 23:58 16人阅读 评论(0) 收藏
  11. Windows进程
  12. IPython,让Python显得友好十倍的外套——windows XP/Win7安装详解
  13. 改变TPageControl的活动标签颜色
  14. English - 被动语态的翻译原则
  15. activemq的安装与使用
  16. bzoj 1705;poj 3612:[Usaco2007 Nov]Telephone Wire 架设电话线
  17. jQuery 事件 - ready() 方法
  18. React Router基础教程
  19. [LOJ6261]一个人的高三楼
  20. C# Winform下一个热插拔的MIS/MRP/ERP框架12(数据处理基类)

热门文章

  1. MSF内网信息收集
  2. python获取上周的起始日期
  3. MC 咖啡杯
  4. vue-cli 根据不同的环境打包
  5. 【SSO单点系列】(6):CAS4.0 之中文乱码
  6. Blog-3
  7. java常用开发学习网站列表
  8. 001. html篇之《基础内容》
  9. uniapp支付返回form
  10. pj_time_swap