golang的channel和waitgroup几个坑

该代码示例展示了在Golang中如何使用goroutine和channel进行并发处理。`BBB`结构体包含一个上下文和一个用于更新余额通知的channel。`doSome`函数监听channel并在接收到地址时启动新的goroutine更新余额。`doOther`函数周期性地向channel发送数据。整个程序使用`sync.WaitGroup`确保goroutine的正确同步和关闭。
摘要由CSDN通过智能技术生成
package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

type BBB struct {
	ctx             context.Context
	chBalanceUpdate chan string
}

func (b *BBB) dosome() {

	wg := sync.WaitGroup{}
	defer wg.Wait()
	for {
		select {
		case address, ok := <-b.chBalanceUpdate:
			if !ok {
				fmt.Println(" channel is closed")
				// return
			}

			// create new goroutine to update balance
			wg.Add(1)
			fmt.Printf("%p", &address)
			go func(addr string, w *sync.WaitGroup) {  PANIC
				defer w.Done()
				// get balance of addr and update into database
				// b.updateBalance(addr)
				fmt.Printf("============do something============:%v\n", address)
			}(address, &wg) // 必须使用  &wg, 而不是 wg
		}
		// time.Sleep(time.Second * 1)
	}
}

func (b *BBB) doother() {
	for  {
		time.Sleep(time.Millisecond * 10)
		b.chBalanceUpdate <- fmt.Sprintf("hello: %v", time.Now().Unix())
	}
	// close(b.chBalanceUpdate)
	// fmt.Println("=======close channel============")
}

func main() {

	// chBalanceUpdate :=

	bb := BBB{
		ctx:             context.Background(),
		chBalanceUpdate: make(chan string, 0), // 如果是有buffer的,即当buffer没满的时候就是非阻塞的,那么读取端就是非阻塞的
	}

	wg := sync.WaitGroup{}
	wg.Add(1)
	go func() {
		defer wg.Done()
		bb.doother()
	}()

	wg.Add(1)
	go func() {
		defer wg.Done()
		bb.dosome()
	}()

	wg.Wait()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值