Golang Go语言中的基本 goroutine 问题请教

发布于 1周前 作者 zlyuanteng 来自 Go语言

第一段代码:

package main

import ( “fmt” “time” )

func main() { names := []string{“Eric”, “Harry”, “Robert”, “Jim”, “Mark”} for _, name := range names { go func() { fmt.Printf(“Hello, %s!\n”, name) }() } time.Sleep(time.Millisecond) }

结果:

package main

import ( “fmt” “time” )

func main() { names := []string{“Eric”, “Harry”, “Robert”, “Jim”, “Mark”} for _, name := range names { go func() { fmt.Printf(“Hello, %s!\n”, name) }() } time.Sleep(time.Millisecond) }

第二段代码:

package main

import ( “fmt” “time” )

func main() { names := []string{“Eric”, “Harry”, “Robert”, “Jim”, “Mark”} for _, name := range names { go func(who string) { fmt.Printf(“Hello, %s!\n”, who) }(name) } time.Sleep(time.Millisecond) }

结果:

package main

import ( “fmt” “time” )

func main() { names := []string{“Eric”, “Harry”, “Robert”, “Jim”, “Mark”} for _, name := range names { go func(who string) { fmt.Printf(“Hello, %s!\n”, who) }(name) } time.Sleep(time.Millisecond) }

问题

为什么第二段就能正常的迭代了呢?


Golang Go语言中的基本 goroutine 问题请教

更多关于Golang Go语言中的基本 goroutine 问题请教的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

up

更多关于Golang Go语言中的基本 goroutine 问题请教的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


没看懂?结果是?

我觉得原因可能是每次 for range k 和 v 不是新建变量,而是变量复用。
所以每次不指定输出的字符串,并发输出 v 的话,都会变成最后一次 v 的值。
说的有点乱,希望你可以理解。

闭包问题

在Go语言中,goroutine 是其并发编程的核心概念之一,它提供了一种轻量级的方式来实现并发执行。以下是对基本 goroutine 的一些关键点解答:

  1. 创建 goroutine: 在Go中,通过 go 关键字可以很简单地创建一个新的 goroutine。例如,go func() { /* 代码块 */ }() 会启动一个新的 goroutine 来执行匿名函数中的代码。

  2. 并发执行: Goroutine 允许程序并发执行多个函数或方法,而不需要使用线程。这使得 Go 程序能够高效地利用多核处理器,并简化并发编程的复杂性。

  3. 通道(Channel): Goroutine 之间通常通过通道进行通信。通道是 Go 提供的用于在 goroutine 之间传递数据的类型化管道。使用通道可以实现同步和数据的共享,而不需要显式的锁机制。

  4. 生命周期: Goroutine 的生命周期由它执行的函数决定。当函数执行完毕时,goroutine 也会结束。此外,Go 的运行时会自动回收已完成 goroutine 的资源。

  5. 注意事项: 使用 goroutine 时,需要注意避免资源泄露和死锁等问题。合理使用通道进行同步和通信,以及确保在不再需要时正确关闭通道,是编写健壮并发程序的关键。

总之,goroutine 是 Go 语言并发编程的强大工具,通过理解其工作原理和正确使用通道,你可以编写出高效且易于维护的并发程序。希望这些解答能帮助你更好地理解和使用 Go 中的 goroutine。

回到顶部