在Go中进行并发编程主要依赖于两个核心概念:Goroutine和Channel。Goroutine是Go语言的轻量级线程,而Channel则用于在Goroutine之间进行通信和同步。
一、Goroutine的使用
Goroutine是通过`go`关键字启动的。以下是一个简单的使用示例:
```go
package main
import (
"fmt"
"time"
)
func sayHello(name string) {
fmt.Printf("Hello, %s\n", name)
}
func main() {
go sayHello("World") // 启动一个Goroutine来执行sayHello函数
// 继续执行其他任务...
fmt.Println("Main function is still running.")
// 等待Goroutine完成(仅当需要时使用)
// time.Sleep(time.Second) // 如果需要等待Goroutine完成,可以使用time.Sleep或其他同步机制
}
```
在上面的代码中,`go sayHello("World")`启动了一个新的Goroutine来执行`sayHello`函数。主函数(`main`函数)会继续执行,而不会等待新启动的Goroutine完成。这就是并发编程的基本思想。
二、Channel的使用
Channel用于在Goroutine之间进行通信。它可以被视为一种管道,用于在Goroutine之间传递值。以下是一个使用Channel的示例:
```go
package main
import (
"fmt"
)
func sayHello(name string, ch chan string) { // 定义一个带有Channel参数的函数
fmt.Printf("Hello, %s\n", name)
ch <- "Done" // 将一个值发送到Channel中,通知其他Goroutine任务已完成
}
func main() {
ch := make(chan string) // 创建一个新的Channel
go sayHello("World", ch) // 启动一个Goroutine来执行sayHello函数,并传递Channel作为参数
<-ch // 从Channel中接收值,等待sayHello函数完成其任务并发送一个值到Channel中
fmt.Println("All done!") // 继续执行主函数的后续任务...
}
```
在上面的代码中,我们创建了一个新的Channel(`ch`),并将其传递给`sayHello`函数的Goroutine中。`sayHello`函数通过向Channel发送一个值(这里是字符串"Done")来通知其他Goroutine其任务已完成。然后,在主函数中,我们使用`<-ch`操作符从Channel中接收值,等待`sayHello`函数的完成。一旦我们接收到这个值,我们就可以继续执行主函数的后续任务了。这就是如何在Go中使用Channel进行并发编程的示例。