Open julian-gamboa-bahia opened 6 months ago
Característica | C | Go |
---|---|---|
Paradigma | Principalmente procedural | Multi-paradigma, suporta procedural, funcional e orientada a objetos (de forma limitada) |
Gerenciamento de Memória | Manual, com gerenciamento explícito do programador (malloc/free) | Automático, com coletor de lixo |
Concorrência | Suporta através de bibliotecas externas como pthreads | Concorrência é um recurso de primeira classe com goroutines e canais |
Pacotes e Reuso | Uso de headers e arquivos de fonte para reutilização de código | Sistema de pacotes integrado e espaço de nome para funções, métodos, etc. |
Erro Handling | Principalmente por meio de códigos de erro e verificações manuais | Uso de valores de retorno múltiplos para erros, e panic/recover para exceções |
Compilação | Compiladores como GCC, múltiplos passos para ligar (linking) | Compilação em um único passo com o compilador 'go', ferramentas de construção integradas |
Tipos de Dados | Não suporta tipo string nativamente, uso de arrays de char | Suporta tipo string nativamente e possui um sistema de tipo mais rico (slices, maps, etc.) |
Sintaxe | Sintaxe mais flexível e complexa para algumas operações | Sintaxe simplificada e mais rigorosa para evitar erros comuns |
Padrões de Projeto | Flexibilidade na organização do código, dependente do desenvolvedor | Encoraja padrões específicos, como o layout de workspace e formato de pacote |
Go Type | Description | Java Equivalent | Notes |
---|---|---|---|
rune |
Represents a Unicode code point | char |
In Go, rune is an alias for int32 . Java's char is a 16-bit type, but doesn't directly represent all Unicode code points without using surrogate pairs. |
uint , uint8 , uint16 , uint32 , uint64 |
Unsigned integers of various sizes | None | Java does not have native unsigned integers. Unsigned data can be handled but with more complex operations. |
complex64 , complex128 |
Complex numbers with float32 and float64 parts | None | Java does not support complex numbers natively; they require a library or custom implementation. |
int , uint , uintptr |
Integers with sizes that vary with the platform | None | Java's integer sizes are fixed, whereas Go's int and uint can vary based on the platform, similar to C/C++. uintptr is an integer large enough to hold the bit pattern of any pointer. |
[]byte |
Slice of bytes (dynamically-sized) | byte[] |
While Java has byte[] , Go's []byte is a slice with more flexibility in manipulation and length management, integrated deeply with Go's slice capabilities. |
chan |
Channels for goroutine communication | None | Java uses different concurrency models, typically involving more complex synchronizations like locks or concurrent data structures. |
Característica | Go | Java |
---|---|---|
Modelo de Concorrência | Baseado em goroutines e canais. Goroutines são mais leves que threads de sistema e gerenciadas pelo runtime de Go. | Baseado em threads, que são mapeadas diretamente para threads do sistema operacional, utilizando APIs como Thread , Runnable , etc. |
Sincronização | Utiliza canais para sincronizar e comunicar entre goroutines, além de primitivas de sincronização como sync.Mutex . |
Utiliza objetos de sincronização como synchronized , ReentrantLock , além de construções como volatile para controle de visibilidade. |
Facilidade de Uso | Simples e integrado na linguagem, com uma sintaxe e abordagem que encoraja o uso de goroutines e canais para tarefas concorrentes. | Requer uma compreensão mais explícita de threads, gerenciamento de vida e sincronização, o que pode ser mais complexo de implementar corretamente. |
Escalabilidade | Muito alta devido à leveza das goroutines, permitindo que milhões delas sejam criadas e gerenciadas sem grande sobrecarga de memória ou contexto. | Menos escalável devido ao uso de threads do sistema operacional, que são mais pesadas e limitadas em número comparado às goroutines. |
Padrões de Design | Encoraja um design baseado em mensagens e eventos, utilizando canais para comunicação entre tarefas. | Tradicionalmente baseado em compartilhamento de estado e sincronização, embora frameworks modernos e bibliotecas possam facilitar modelos reativos ou baseados em mensagens. |
Bibliotecas e Frameworks | O próprio runtime de Go oferece robusto suporte para paralelismo e concorrência, com pouca necessidade de bibliotecas externas. | Extensivo suporte através de bibliotecas como java.util.concurrent, Akka (para sistemas atores), e outras frameworks para paralelismo e concorrência. |
Desempenho em Carga Alta | Alto desempenho sob cargas concorrentes devido à menor sobrecarga de troca de contexto entre goroutines. | Pode sofrer com a sobrecarga de gerenciamento de muitas threads, especialmente em aplicações com muitas operações de bloqueio e sincronização. |
Característica | Array | Slice |
---|---|---|
Definição | Coleção de elementos com tamanho fixo e definido na declaração. | Vista dinâmica sobre um array, com tamanho flexível. |
Tamanho | Fixo, definido na declaração e imutável. | Dinâmico, pode mudar durante a execução do programa. |
Tipo | O tamanho do array é parte do tipo. Por exemplo, um array de tamanho 5 é diferente de um array de tamanho 6. | O tipo de um slice não inclui seu tamanho ou capacidade. |
Declaração | var arr [5]int define um array de 5 inteiros. |
s := arr[1:4] cria um slice usando um array existente. |
Armazenamento de Dados | Possui seu próprio espaço de armazenamento. | Não possui seu próprio espaço de armazenamento; é uma "visão" sobre um array existente. |
Componentes | Não aplica. | Ponteiro para o elemento inicial, comprimento (número de elementos visíveis) e capacidade (máximo de elementos a partir do ponteiro inicial). |
Criação | Alocado estaticamente ou durante a inicialização. | Pode ser criado a partir de um array existente ou com make , que aloca um array e retorna um slice referenciando ele. |
Flexibilidade | Menos flexível, pois o tamanho e os elementos são fixos. | Mais flexível, permitindo subconjuntos dinâmicos de arrays e redimensionamento. |
Eficiência | Mais controlado em termos de uso de memória quando o tamanho é conhecido e constante. | Mais eficiente ao manipular subconjuntos de dados sem a necessidade de copiar elementos. |
Uso na Linguagem | Menos utilizado diretamente na maioria das APIs Go. | Amplamente usado nas APIs Go devido à sua flexibilidade e facilidade de uso. |
Característica | Windows | Linux |
---|---|---|
Modelo de Escalonamento | Baseado em prioridades, com múltiplos níveis de prioridade e quanta de tempo variável. | Baseado em prioridades com um escalonador de tempo compartilhado (Completely Fair Scheduler - CFS) que busca a equidade na execução dos processos. |
Granularidade do Thread | Suporta tanto threads de usuário quanto threads do kernel. Threads de usuário são leves e gerenciados em espaço de usuário, enquanto threads do kernel são gerenciados pelo sistema operacional. | Usa um modelo de 1:1 para threads, onde cada thread em espaço de usuário corresponde a um thread em espaço de kernel. |
Interação com o Hardware | Interface direta com a HAL (Camada de Abstração de Hardware) para gerenciar hardware específico e otimizações. | Uso de módulos do kernel e drivers que podem ser carregados e descarregados para otimização do hardware, mas com uma abordagem mais uniforme. |
Administração de Carga de Trabalho | Usa o Windows Scheduler, que pode ajustar a prioridade dos threads dinamicamente com base no uso e outros critérios. | Usa o CFS que tenta distribuir a carga de trabalho de forma justa entre todos os threads, permitindo ajustes via nice e outras políticas de escalonamento. |
Eficiência em Multi-Core | Eficiente em distribuir threads por múltiplos cores para maximizar o desempenho, com políticas avançadas para evitar a migração frequente de threads entre cores. | Também eficiente, com suporte a NUMA (Non-Uniform Memory Access) e otimizações para reduzir a latência e maximizar o throughput em sistemas multi-core. |
Afinidade de Thread | Suporta a configuração de afinidade de thread para determinar em quais cores específicos threads podem ser executados. | Similar ao Windows, suporta a configuração de afinidade de thread para otimizar o desempenho em sistemas com múltiplos processadores ou cores. |
Escalabilidade | Projetado para escalar bem em sistemas com muitos processadores, usando grupos de processadores e sofisticadas técnicas de balanceamento de carga. | Altamente escalável, especialmente em ambientes de servidor e data centers, com técnicas robustas para balanceamento de carga e gerenciamento de processos. |
Transparência e Configurabilidade | Menos transparente devido ao seu modelo comercial. Oferece algumas ferramentas de administração, mas detalhes mais profundos do escalonador são menos acessíveis. | Altamente configurável e transparente, com a capacidade de modificar e ajustar o kernel e o escalonador conforme necessário, devido à sua natureza open source. |
Característica | WSL (Windows Subsystem for Linux) | Linux Tradicional |
---|---|---|
Integração de Sistema | Executa em cima do Windows, usando uma camada de compatibilidade para executar binários do Linux. | Sistema operacional completo que gerencia diretamente o hardware e os recursos do sistema. |
Desempenho | Bom desempenho para a maioria das aplicações de desenvolvimento, mas com potenciais gargalos em operações específicas de I/O ou gráficas devido à camada de abstração. | Desempenho nativo, com acesso direto ao hardware, oferecendo performance superior para a maioria das tarefas, especialmente aquelas que são intensivas em recursos. |
Gerenciamento de Hardware | Limitado pelo Windows. O acesso ao hardware é abstraído e controlado pelo Windows, o que pode limitar a funcionalidade de certos programas que necessitam acesso direto ao hardware. | Controle completo sobre o hardware, com a capacidade de modificar drivers e ajustar o sistema para otimizar o desempenho e a funcionalidade. |
Compatibilidade de Software | Alta compatibilidade com software de linha de comando Linux, mas pode enfrentar problemas com softwares que requerem componentes específicos do kernel Linux não implementados no WSL. | Suporta todo o software projetado para Linux, sem restrições de compatibilidade relativas ao sistema operacional. |
Ambiente de Desenvolvimento | Ideal para desenvolvedores que usam Windows como sistema principal mas querem a flexibilidade de ferramentas e ambientes Unix. | Ideal para desenvolvimento que requer um ambiente Unix/Linux completo, incluindo a capacidade de executar aplicativos de servidor, dockers, etc., em produção. |
Suporte a Ferramentas de Rede | Alguns comandos e ferramentas de rede podem não funcionar como esperado devido às diferenças na implementação de rede entre Windows e Linux. | Suporte completo para todas as ferramentas e comandos de rede nativos do Linux. |
Manutenção e Atualizações | Dependente das atualizações do Windows e do desenvolvimento do próprio WSL pela Microsoft. | Os usuários têm controle total sobre atualizações e manutenção, com acesso a várias distribuições e versões do kernel. |
Uso de Recursos | Geralmente mais leve em termos de uso de recursos do que uma VM completa, mas ainda sujeito ao overhead geral do sistema Windows. | Pode ser otimizado para ser extremamente eficiente em termos de recursos, especialmente em configurações de servidor ou sistemas embarcados. |
Característica | Java (try-catch) | Go (gerenciamento de erros) |
---|---|---|
Mecanismo | Baseado em exceções que podem ser lançadas e capturadas usando blocos try e catch . |
Baseado em retornar valores de erro que devem ser verificados explicitamente. |
Fluxo de controle | O fluxo de controle é interrompido quando uma exceção é lançada. O controle pode ser transferido para um bloco catch correspondente se disponível. |
O fluxo de controle continua normalmente a menos que um erro seja explicitamente verificado e manipulado. |
Verificação de erros | As exceções podem ser capturadas de forma genérica com um único bloco catch que pode tratar múltiplos tipos de exceções. |
Os erros são valores, normalmente do tipo error . Cada chamada de função que pode falhar retorna um erro que deve ser verificado explicitamente. |
Tipos de erro | Suporta a criação de muitos tipos de exceções, incluindo exceções personalizadas. | Normalmente utiliza um único tipo de erro, o interface error , mas pode ser personalizado implementando o método Error() string . |
Forçar tratamento | Exceções verificadas forçam o chamador a tratar ou declarar a exceção. | Não há exceções verificadas; o tratamento de erros é sempre opcional (embora fortemente aconselhado). |
Impacto na assinatura do método | As exceções que um método pode lançar são parte de sua assinatura (exceções verificadas). | A possibilidade de erro é indicada na assinatura do método/função pela presença de um retorno error . |
Código de manutenção | Pode levar a um código poluído com muitos blocos try-catch para funções que lançam várias exceções. |
Promove um código mais limpo, com verificações de erro lineares que seguem o fluxo normal do código. |
Performance | Tratar exceções pode ser caro em termos de performance, especialmente se muitas exceções são lançadas e capturadas. | Menos custoso em termos de performance, pois não há custo associado ao lançamento de exceções; os erros são apenas valores retornados. |
Característica | Descrição das Goroutines |
---|---|
Definição | Goroutines são funções ou métodos que executam de forma concorrente como threads leves dentro de um programa Go. |
Criação | Criadas usando a palavra-chave go seguida por uma chamada de função. Exemplo: go f(x, y, z) . Isso inicia a execução de f(x, y, z) como uma goroutine. |
Custo de Memória | Goroutines têm um custo de memória muito baixo comparado a threads. Uma nova goroutine pode ser iniciada com apenas 2 KB de pilha, que é dinamicamente ajustável. |
Escalonamento | Gerenciadas pelo runtime de Go, não pelo sistema operacional. O runtime de Go contém um escalonador interno que mapeia as goroutines em um número menor de threads do sistema. |
Sincronização | Frequentemente sincronizadas usando canais, que permitem a troca de valores entre goroutines de maneira segura. Outras primitivas de sincronização incluem mutexes e wait groups. |
Uso | Ideais para operações concorrentes, como manipulação de múltiplas conexões de rede, onde cada conexão pode ser tratada por uma goroutine separada. |
Modelo de Concorrência | Promove um modelo de programação baseado em comunicação em vez de compartilhamento de memória. O mantra é: "Não comunique compartilhando memória; em vez disso, compartilhe memória comunicando." |
Vantagens | Extremamente leves em termos de overhead de memória e tempo de troca de contexto. Facilita a escrita de programas concorrentes limpos e modulares. |
Desvantagens | Pode ser desafiador gerenciar estados compartilhados e garantir que as goroutines não causem deadlocks ou outros problemas de sincronização. |
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
Palavra Reservada | Exemplo de Uso | Comentário Didático |
---|---|---|
break | for i := 0; i < 10; i++ { if i == 5 { break } } |
Encerra o loop mais interno quando i é igual a 5. |
case | switch x { case 1: fmt.Println("Um") } |
Define uma condição dentro de um bloco switch . |
chan | c := make(chan int) |
Declara um canal para comunicação concorrente. |
const | const Pi = 3.14 |
Define uma constante numérica. |
continue | for i := 0; i < 10; i++ { if i%2 == 0 { continue } } |
Pula para a próxima iteração do loop se i é par. |
default | switch x { default: fmt.Println("Padrão") } |
Caso padrão em um switch se nenhum outro case corresponder. |
defer | defer fmt.Println("Finalizado") |
Agenda uma função para ser chamada após a função atual terminar. |
else | if x > 0 { fmt.Println("Positivo") } else { fmt.Println("Negativo") } |
Bloco executado se a condição if não for verdadeira. |
fallthrough | switch x { case 0: fallthrough case 1: fmt.Println("Menor que 2") } |
Força a execução do próximo case no switch . |
for | for i := 0; i < 10; i++ { fmt.Println(i) } |
Estrutura de loop que repete o bloco de código. |
func | func soma(a int, b int) int { return a + b } |
Define uma função chamada soma . |
go | go func() { fmt.Println("Hello, goroutine") }() |
Inicia uma nova goroutine, uma thread leve. |
goto | goto End; End: fmt.Println("Fim") |
Salta para o rótulo End dentro do mesmo código. |
if | if x > 0 { fmt.Println("Maior que zero") } |
Condicional que executa um bloco se a condição for verdadeira. |
import | import "fmt" |
Importa o pacote fmt para uso no programa. |
interface | type Geometric interface { Area() float64 } |
Define uma interface chamada Geometric . |
map | m := map[string]int{"a": 1, "b": 2} |
Cria um mapa de strings para inteiros. |
package | package main |
Declara o pacote em que o arquivo de código reside. |
range | for key, value := range map { fmt.Println(key, value) } |
Itera sobre elementos de um mapa, slice, array ou string. |
return | func getTen() int { return 10 } |
Retorna um valor da função. |
select | select { case msg := <-c: fmt.Println(msg) } |
Espera por várias operações de comunicação concorrente. |
struct | type Pessoa struct { Nome string; Idade int } |
Define uma estrutura de dados com nome Pessoa . |
switch | switch x { case 0: fmt.Println("Zero") } |
Estrutura de controle que executa um bloco de código com base no valor de x . |
type | type Numero int |
Define um novo tipo chamado Numero baseado em int. |
var | var x int |
Declara uma variável x do tipo int . |
Versão | Data de Lançamento | Componentes Afetados | Descrição da Segurança |
---|---|---|---|
Go 1.22.1 | 2024-03-05 | crypto/x509, html/template, net/http, net/http/cookiejar, net/mail | Inclui correções de segurança para múltiplos pacotes. |
Go 1.22.2 | 2024-04-03 | net/http | Inclui uma correção de segurança específica para o pacote net/http. |
Go 1.21.1 | 2023-09-06 | cmd/go, crypto/tls, html/template | Corrige quatro vulnerabilidades de segurança em diversos pacotes. |
Go 1.21.3 | 2023-10-10 | net/http | Correção de segurança para o pacote net/http. |
Go 1.21.4 | 2023-11-07 | path/filepath | Correções de segurança para o pacote path/filepath. |
Go 1.21.5 | 2023-12-05 | go command, net/http, path/filepath | Correções de segurança envolvendo o comando go e pacotes net/http e path/filepath. |
Go 1.21.8 | 2024-03-05 | crypto/x509, html/template, net/http, net/http/cookiejar, net/mail | Semelhante à Go 1.22.1, várias correções de segurança em pacotes essenciais. |
Go 1.21.9 | 2024-04-03 | net/http | Correção de segurança específica para o pacote net/http. |
Go 1.20.1 | 2023-02-14 | crypto/tls, mime/multipart, net/http, path/filepath | Correções de segurança em vários pacotes essenciais para a segurança das comunicações. |
Go 1.20.2 | 2023-03-07 | crypto/elliptic | Correção de segurança no pacote crypto/elliptic. |
Go 1.20.3 | 2023-04-04 | go/parser, html/template, mime/multipart, net/http, net/textproto | Várias correções de segurança que afetam o processamento de dados e protocolos HTTP. |
Go 1.20.4 | 2023-05-02 | html/template | Correções de segurança no pacote html/template para prevenir ataques de script cross-site. |
Go 1.20.6 | 2023-07-11 | net/http | Correção de segurança no pacote net/http. |
Go 1.20.7 | 2023-08-01 | crypto/tls | Correção de segurança em crypto/tls para fortalecer a segurança do transporte. |
Go 1.20.10 | 2023-10-10 | net/http | Correção de segurança no pacote net/http. |
Detalhes de segurança : | Versão | Data de Lançamento | Componentes Afetados | Descrição da Segurança |
---|---|---|---|---|
Go 1.22.1 | 2024-03-05 | crypto/x509, html/template, net/http, net/http/cookiejar, net/mail | Correções de segurança para múltiplos pacotes. | |
Go 1.22.2 | 2024-04-03 | net/http | Correção de segurança específica para o pacote net/http. | |
Go 1.21.1 | 2023-09-06 | cmd/go, crypto/tls, html/template | Corrige quatro vulnerabilidades de segurança em diversos pacotes. | |
Go 1.21.2 | 2023-10-05 | cmd/go | Correção de segurança no comando go. | |
Go 1.21.3 | 2023-10-10 | net/http | Correção de segurança para o pacote net/http. | |
Go 1.21.4 | 2023-11-07 | path/filepath | Correções de segurança para o pacote path/filepath. | |
Go 1.21.5 | 2023-12-05 | go command, net/http, path/filepath | Correções de segurança envolvendo o comando go e pacotes net/http e path/filepath. | |
Go 1.21.6 | 2024-01-09 | crypto/tls | Atualizações e correções no pacote crypto/tls. | |
Go 1.21.7 | 2024-02-06 | crypto/x509 | Correções e atualizações no pacote crypto/x509. | |
Go 1.21.8 | 2024-03-05 | crypto/x509, html/template, net/http, net/http/cookiejar, net/mail | Semelhante à Go 1.22.1, várias correções de segurança em pacotes essenciais. | |
Go 1.21.9 | 2024-04-03 | net/http | Correção de segurança específica para o pacote net/http. | |
Go 1.20.1 | 2023-02-14 | crypto/tls, mime/multipart, net/http, path/filepath | Correções de segurança em vários pacotes essenciais para a segurança das comunicações. | |
Go 1.20.2 | 2023-03-07 | crypto/elliptic | Correção de segurança no pacote crypto/elliptic. | |
Go 1.20.3 | 2023-04-04 | go/parser, html/template, mime/multipart, net/http, net/textproto | Várias correções de segurança que afetam o processamento de dados e protocolos HTTP. | |
Go 1.20.4 | 2023-05-02 | html/template | Correções de segurança no pacote html/template para prevenir ataques de script cross-site. | |
Go 1.20.5 | 2023-06-06 | cmd/go, runtime | Correções de segurança e atualizações no comando go e no runtime. | |
Go 1.20.6 | 2023-07-11 | net/http | Correção de segurança no pacote net/http. | |
Go 1.20.7 | 2023-08-01 | crypto/tls | Correção de segurança em crypto/tls para fortalecer a segurança do transporte. | |
Go 1.20.8 | 2023-09-06 | html/template | Correções de segurança no pacote html/template. | |
Go 1.20.9 | 2023-10-05 | cmd/go | Correção de segurança no comando go. | |
Go 1.20.10 | 2023-10-10 | net/http |
| Correção de segurança no pacote net/http. | | Go 1.20.11| 2023-11-07 | path/filepath | Correções de segurança no pacote path/filepath. | | Go 1.20.12| 2023-12-05 | go command, net/http, path/filepath | Correções de segurança envolvendo o comando go e pacotes net/http e path/filepath. | | Go 1.20.13| 2024-01-09 | crypto/tls | Atualizações e correções no pacote crypto/tls. | | Go 1.20.14| 2024-02-06 | crypto/x509 | Correções e atualizações no pacote crypto/x509. |
Característica | C | GoLang |
---|---|---|
Tipo Personalizado | typedef int Inteiro; |
type Inteiro int |
Declaração | Inteiro dobrar(Inteiro i) { |
func (i Inteiro) Dobrar() Inteiro { |
Corpo da Função | return i * 2; |
return i * 2 |
Encerramento | } |
} |
Chamada da Função | Inteiro resultado = dobrar(num); |
resultado := num.Dobrar() |
Comentário | // Função que simula o método 'Dobrar' em Go | // Método que retorna o dobro do valor do receptor |