在Ubuntu上使用Golang进行并发编程,主要依赖于Go语言的轻量级线程——goroutines和通道(channels)。以下是一些基本的并发编程概念和示例:
go
。package main import ( "fmt" "time" ) func printNumbers() { for i := 1; i <= 5; i++ { fmt.Printf("Number: %d\n", i) time.Sleep(1 * time.Second) } } func main() { go printNumbers() // 创建一个新的goroutine来执行printNumbers函数 time.Sleep(6 * time.Second) // 等待足够的时间以查看goroutine的输出 }
package main import ( "fmt" "time" ) func main() { ch := make(chan int) // 创建一个整数类型的channel go func() { for i := 1; i <= 5; i++ { ch <- i // 将数据发送到channel time.Sleep(1 * time.Second) } close(ch) // 关闭channel }() for num := range ch { // 从channel接收数据,直到它被关闭 fmt.Printf("Received number: %d\n", num) } }
sync.WaitGroup
、sync.Mutex
和sync.RWMutex
,以确保在并发环境中正确地同步数据。package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup var mu sync.Mutex counter := 0 for i := 0; i < 5; i++ { wg.Add(1) // 增加WaitGroup的计数器 go func() { defer wg.Done() // 在goroutine完成时减少WaitGroup的计数器 mu.Lock() // 获取互斥锁 counter++ fmt.Printf("Counter: %d\n", counter) mu.Unlock() // 释放互斥锁 }() } wg.Wait() // 等待所有goroutines完成 }
这些示例展示了如何在Ubuntu上使用Golang进行基本的并发编程。你可以根据自己的需求调整这些示例,以实现更复杂的并发逻辑。