English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基础教程

Golang 控制语句

Golang 函数 & 方法

Golang 结构体

Golang 切片 & 数组

Golang 字符串(String)

Golang 指针

Golang 接口

Golang 并发

Golang 异常(Error)

Golang 其他杂项

Concorrência (Goroutines) do Go

Go语言提供了称为Goroutines的特殊功能。Goroutine是一种函数或方法,可与程序中存在的任何其他Goroutine一起独立且同时执行。换句话说,每个Go语言中同时执行的活动称为Goroutines,您可以将Goroutine视为轻量级线程。与线程相比,创建Goroutines的成本非常小。每个程序至少包含一个Goroutine,并且该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.

Vantagens das Goroutines

  • 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.

Goroutine Anônima

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