A linguagem Go oferece um recurso especial conhecido como Goroutines. Um Goroutine é uma função ou método que executa independentemente e simultaneamente em conexão com qualquer outro Goroutine presente em seu programa. Ou em outras palavras, toda atividade em execução simultânea na linguagem Go é conhecida como Goroutines. Você pode considerar um Goroutine como um fio leve. O custo de criação de Goroutines é muito pequeno em comparação com o segmento. Cada programa contém pelo menos um único Goroutine e esse Goroutine é conhecido como Goroutine principal . Todos os Goroutines estão trabalhando sob os Goroutines principais se o Goroutine principal for encerrado, então todos os goroutines presentes no programa também serão encerrados. Goroutine sempre funciona em segundo plano.

Como criar um Goroutine?

Você pode criar seu próprio Goroutine simplesmente usando a palavra-chave go como um prefixo para a chamada de função ou método, conforme mostrado na sintaxe abaixo:

Sintaxe:

func name(){
// statements
}

// using go keyword as the 
// prefix of your function call
go name()

Exemplo:

// Go program to illustrate
// the concept of Goroutine
package main
  
import "fmt"
  
func display(str string) {
    for w := 0; w < 6; w++ {
        fmt.Println(str)
    }
}
  
func main() {
  
    // Calling Goroutine
    go display("Welcome")
  
    // Calling normal function
    display("GeeksforGeeks")
}

Saída:

GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks
GeeksforGeeks

No exemplo acima, simplesmente criamos uma função display() e, em seguida, chamamos essa função de duas maneiras diferentes, primeiro uma é Goroutine, ou seja, vá display (“Bem-vindo”) e a outra é uma função normal, ou seja, display (“GeeksforGeeks” ) . Mas há um problema, ele só exibe o resultado da função normal que não exibe o resultado de Goroutine porque quando um novo Goroutine é executado, a chamada de Goroutine retorna imediatamente. O controle não espera que o Goroutine conclua sua execução, assim como a função normal, eles sempre avançam para a próxima linha após a chamada do Goroutine e ignora o valor retornado pelo Goroutine. Então, para executar um Goroutine corretamente, fizemos algumas alterações em nosso programa conforme mostrado no código abaixo:

Exemplo modificado:

// Go program to illustrate the concept of Goroutine
package main
  
import (
    "fmt"
    "time"
)
  
func display(str string) {
    for w := 0; w < 6; w++ {
        time.Sleep(1 * time.Second)
        fmt.Println(str)
    }
}
  
func main() {
  
    // Calling Goroutine
    go display("Welcome")
  
    // Calling normal function
    display("GeeksforGeeks")
}

Saída:

Welcome
GeeksforGeeks
GeeksforGeeks
Welcome
Welcome
GeeksforGeeks
GeeksforGeeks
Welcome
Welcome
GeeksforGeeks
GeeksforGeeks

Nós adicionamos o método Sleep() em nosso programa que faz o Goroutine principal dormir por 1 segundo entre 1 segundo em que o novo Goroutine é executado, exibe " welcome " na tela e, em seguida, termina após 1 segundo principal Goroutine re-agendar e realizar sua operação. Este processo continua até que o valor de z <6 depois que o Goroutine principal termine. Aqui, Goroutine e a função normal funcionam simultaneamente.

Vantagens de Goroutines

  • Goroutines são mais baratos do que threads.
  • Goroutine é armazenado na pilha e o tamanho da pilha pode aumentar e diminuir de acordo com os requisitos do programa. Mas em threads, o tamanho da pilha é fixo.
  • Goroutines podem se comunicar usando o canal e esses canais são especialmente projetados para evitar condições de corrida ao acessar a memória compartilhada usando Goroutines.
  • Suponha que um programa tenha um encadeamento e esse encadeamento tenha muitos Goroutines associados a ele. Se algum Goroutine bloquear o thread devido ao requisito de recursos, todos os Goroutines restantes serão atribuídos a um thread de sistema operacional recém-criado. Todos esses detalhes são ocultados dos programadores.

Goroutine anônima

Na linguagem Go, você também pode iniciar o Goroutine para uma função anônima ou em outras palavras, você pode criar um Goroutine anônimo simplesmente usando a palavra-chave go como um prefixo dessa função, conforme mostrado na sintaxe abaixo:

Sintaxe:

// Anonymous function call
go func (parameter_list){
// statement
}(arguments)

Exemplo:

// Go program to illustrate how
// to create an anonymous Goroutine
package main
  
import (
    "fmt"
    "time"
)
  
// Main function
func main() {
  
    fmt.Println("Welcome!! to Main function")
  
    // Creating Anonymous Goroutine
    go func() {
  
        fmt.Println("Welcome!! to GeeksforGeeks")
    }()
  
    time.Sleep(1 * time.Second)
    fmt.Println("GoodBye!! to Main function")
}

Saída:

Welcome!! to Main function
Welcome!! to GeeksforGeeks
GoodBye!! to Main function