Go踩坑记录

goroutine和闭包

for i:= 0; i < 10; i++ {
	go func(){
		time.Sleep(time.Duration(100) * time.Millisecond)
		fmt.Printf("%d\n", i)
	}()
}

预期:输出0~9
实际:输出全部是10
原因:在10个goroutine中,输出的 i都是for循环这个scope里的 i,这个值在 for循环中已经发生了变化,最后维持在10

可以修改成:

for i:= 0; i < 10; i++ {
	go func(int _i){
		time.Sleep(time.Duration(100) * time.Millisecond)
		fmt.Printf("%d\n", _i)
	}(i)
}

传值和WaitGroup

func run(taskcount int) {
	group := sync.WaitGroup{}
	group.Add(taskcount)
	
	for i:=0; i < taskcount; i++ {
		go doTask(group)
	}
	group.Wait()
}

func doTask(group sync.WaitGroup) {
	dosometing()
	group.Done()	
}

预期:run能够正确执行
实际:group.Wait()一直无法结束
原因:调用的doTask的时候group是值拷贝方式,在doTask中修改group不会影响run中的group,所以group.Wait()一直阻塞

可以修改成:

func run(taskcount int) {
	group := sync.WaitGroup{}
	group.Add(taskcount)
	
	for i:=0; i < taskcount; i++ {
		go doTask(&group)
	}
	group.Wait()
}

func doTask(group *sync.WaitGroup) {
	dosometing()
	group.Done()	
}

strings.Compare and make

func byteToString() byte[] {
	s := "ABCDEFG"
	byteArray := make([]byte, len(s))
	for _, c := range s {
		byteArray = append(byteArray, c)
	}
	byteS := string(byteArray)
	// byteS contains exrta bytes as make inits it with size len(s)
	fmt.Printf("equal by ==? %v\n", byteS == s) 
	fmt.Printf("equal by strings.Compare? %v\n", strings.Compare(byteS, s) == 0)
}

output:
equal by ==? false
equal by strings.Compare? true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值