在Go中,goroutine是一个执行的独立路径,它与其他goroutine在同一个地址空间并发执行。您可以通过在函数或者方法前加上go
关键字来创建一个goroutine。
func sayHello() {
fmt.Println("Hello, World!")
}
func main() {
go sayHello()
time.Sleep(100 * time.Millisecond) // wait for sayHello() to finish
}
在这个例子中,sayHello()
函数在一个新的goroutine中执行,主函数不会等待它完成就继续执行。因此,我们需要让主函数等待一段时间,以确保sayHello()
函数有足够的时间执行。
Channels是Go中的一种类型,您可以通过它们发送类型化的数据在两个并发执行的goroutines之间进行通信。创建新的channel的方法是使用make
函数,可以使用<-
操作符向channel发送和接收数据。
messages := make(chan string)
go func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
在这个例子中,我们首先创建了一个新的string类型的channel。然后在一个新的goroutine中向这个channel发送了一个"ping"字符串。主函数通过<-messages
从channel中接收数据,将接收的数据赋值给msg
,然后打印。
默认情况下,channel是没有缓冲的,只有在接收方准备好接收时,发送方才能向channel发送数据。然而,我们可以创建一个带有缓冲的channel,通过为make
函数提供第二个参数来设置缓冲的数量。
messages := make(chan string, 2)
messages <- "buffered"
messages <- "channel"
fmt.Println(<-messages)
fmt.Println(<-messages)
在这个例子中,我们创建了一个可以存储两个string的channel。因此,我们可以向这个channel连续发送两次数据,而不需要并发的接收。
Go的并发模型通过其简洁的设计和强大的能力,让复杂的并发编程变得更加容易。请记住,正确使用goroutines和channels是编写高效,可扩展Go程序的关键。