English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Go语言提供了称为Goroutines的特殊功能。Goroutine是一种函数或方法,可与程序中存在的任何其他Goroutine一起独立且同时执行。换句话说,每个Go语言中同时执行的活动称为Goroutines,您可以将Goroutine视为轻量级线程。与线程相比,创建Goroutines的成本非常小。每个程序至少包含一个Goroutine,并且该Goroutine被称为主Goroutine。如果主Goroutine终止,则所有Goroutine在主Goroutine之下运行,那么程序中存在的所有goroutine也将终止;Goroutine始终在后台运行。
您只需使用go关键字作为函数或方法调用的前缀,即可创建自己的Goroutine,如以下语法所示:
Sintaxe:
func name(){ // Sentença } // 在函数名前面,使用go关键字 go name()
package main import "fmt" func display(str string) { for w := 0; 6; w++ { fmt.Println(str) } } func main() { // Chamada de Goroutine go display("Bem-vindo") //正常调用函数 display("oldtoolbag.com) }
Saída:
oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com
在上面的示例中,我们仅创建了display()函数,然后以两种不同的方式调用此函数,第一种是Goroutine,即go display("Welcome"),另一种是常规调用函数,即display("w3codebox)
但是您可能发现问题了,它只显示调用普通函数的结果,而不显示Goroutine的结果,因为执行新的Goroutine时,Goroutine调用会立即返回。它不像普通函数那样等待Goroutine完成执行,它们总是在Goroutine调用后一直前进到下一行,并忽略Goroutine返回的值。因此,为了正确执行Goroutine,我们对程序进行了一些更改,如以下代码所示:
修改后的Goroutine示例:
package main import ( "fmt" "time" ) func display(str string) { for w := 0; 6; w++ { time.Sleep(1 * time.Second) fmt.Println(str) } } func main() { // Chamada de Goroutine go display("Bem-vindo") //Chamada de função comum display("w3codebox) }
Saída:
Bem-vindo w3codebox w3codebox Bem-vindo Bem-vindo w3codebox w3codebox Bem-vindo Bem-vindo w3codebox w3codebox
Adicionamos o método Sleep() ao programa, que faz a Goroutine principal aguardar enquanto a nova Goroutine é executada1Segundos entre sono1Segundos, mostrando a mensagem de boas-vindas na tela, e então1O Goroutine principal recarrega e executa suas operações após <6Depois que a Goroutine principal termina. Aqui, a Goroutine e a função comum trabalham ao mesmo tempo.
Goroutines têm menor overhead em comparação com threads.
Goroutines são armazenadas em pilhas e o tamanho dessas pilhas pode aumentar e diminuir conforme necessário pelo programa. No entanto, no caso de threads, o tamanho da pilha é fixo.
Goroutines podem se comunicar usando canais, e esses canais são projetados de forma especial para evitar situações de concorrência ao acessar memória compartilhada por Goroutines.
Suponha que um programa tenha uma thread e muitas Goroutines associadas a ela. Se qualquer Goroutine bloquear devido a necessidades de recursos, todas as outras Goroutines serão alocadas para uma nova thread do SO. Todos esses detalhes são ocultos para o programador.
No idioma Go, você também pode iniciar Goroutines para funções anônimas, em outras palavras, você pode simplesmente usar a palavra-chave go como prefixo da função para criar Goroutines anônimas, conforme a sintaxe a seguir:
Sintaxe:
//Chamada de função anônima go func(parâmetro_list){ // Sentença )(argumentos)
package main import ( "fmt" "time" ) func main() { fmt.Println("Bem-vindo!! para a função Principal") //Criar Goroutine Anônima go func() { fmt.Println("Bem-vindo!! para oldtoolbag.com) }) time.Sleep(1 * time.Second) fmt.Println("Adeus!! para a função Principal") }
Saída:
Bem-vindo!! para a função Principal Bem-vindo!! para oldtoolbag.com Adeus!! para a função Principal