Na linguagem Go, o CGO permite que programas Go chamem diretamente o código da linguagem C. Isso é conseguido vinculando os binários das linguagens Go e C. Dessa forma, os programas Go podem usar bibliotecas C ou código C onde o desempenho é crítico.
Introdução de CGOs
Para usar o CGO em um programa Go, você precisa importar o pacote “C”:
import "C"
O pacote "C" é um pacote especial que realmente não existe na biblioteca padrão do Go. Quando o compilador vê esta instrução de importação, ele inicia o CGO.
Incorporação de código de linguagem C
Depois de importar "C", você pode incorporar o código da linguagem C nos comentários. Este código da linguagem C será extraído pelo compilador em tempo de compilação e depois vinculado ao código Go.
Por exemplo, você pode incorporar uma função C como esta:
/*
#include <stdio.h>
void myprint(char* s) {
printf("%s\n", s);
}
*/
import "C"
Este código incorpora uma função C myprint
que pega um parâmetro de string e o imprime.
Chamada de função em linguagem C
As funções incorporadas da linguagem C podem ser chamadas como funções Go normais. Por exemplo, você pode chamar myprint
uma função como esta:
func main() {
C.myprint(C.CString("Hello, CGO"))
}
Observe que temos que usar C.CString
uma função para converter uma string Go em uma string C, porque a representação na memória de uma string C e de uma string Go é diferente.
Links para a biblioteca da linguagem C
O CGO também permite vincular bibliotecas em linguagem C. Por exemplo, você pode vincular a biblioteca C padrão libc
:
/*
#cgo LDFLAGS: -lc
#include <stdio.h>
*/
import "C"
#cgo LDFLAGS: -lc
diretiva diz ao compilador para vincular libc
a biblioteca. Então, você pode chamar libc
funções na biblioteca.
No geral, CGO é uma ferramenta poderosa que permite que programas Go chamem diretamente o código C. Porém, você precisa estar ciente de que o uso do CGO aumentará o tempo de compilação e também tornará o programa menos portável. Portanto, o CGO deve ser evitado, a menos que seja necessário.