«

Golang 并发编程Demo1

时间:2025-1-10 15:10     作者:杨佳乐     分类: Golang


package main

import "fmt"
import "sync"

// 并发demo1
// 假如我正在写一个响应用户信息的接口,这个接口需要获取用户基本信息、余额明细这两个比较耗时的操作
// 此时可以通过goroutine开启两个线程,同时处理获取这两个数据的操作,都获取完了以后组合数据响应
func main(){
    fmt.Println(getUserData())
}

// 定义一个用户数据结构体
type UserData struct{
    BaseInfo string
    BalanceInfo string
}

// 获取用户基本信息函数
func getBaseInfo(ch chan<- string){
    ch <- "张三"
}

//获取用户余额信息函数
func getBalanceInfo(ch chan<- string){
    ch <- "余额"
}

func getUserData() UserData {
    // 定义一个WaitGroup 等待所有任务执行完成
    var wg sync.WaitGroup

    ch1 := make(chan string)
    ch2 := make(chan string)

    wg.Add(1)
    go func(){
        defer wg.Done()
        getBaseInfo(ch1)
    }()

    wg.Add(1)
    go func(){
        defer wg.Done()
        getBalanceInfo(ch2)
    }()

    udata := UserData{
        BaseInfo:  <-ch1,
        BalanceInfo: <-ch2,
    }

    //wg.Wait 需要放在接收数据后面,否则会导致死锁,因为wg Wait是阻塞的,放在后面,没有接收通道数据
    wg.Wait()  

    return udata
}