Todo valor em um programa tem um tipo, que define duas coisas: quanto espaço ele ocupa na memória e quais operações fazem sentido com ele (somar dois números faz; somar dois booleanos, não).
Primitivos e compostos
- Primitivos: os blocos básicos, que a linguagem já traz: inteiros, ponto flutuante, booleanos, caracteres.
- Compostos: construídos a partir de outros tipos: arrays, listas, mapas, structs, classes.
| Go | Java | |
|---|---|---|
| Inteiros | int8, int16, int32, int64, int (32 ou 64 bits, conforme a plataforma), versões uint sem sinal | byte (8), short (16), int (32), long (64), todos com sinal |
| Ponto flutuante | float32, float64 | float, double |
| Booleano | bool | boolean |
| Caractere | byte (= uint8), rune (= int32, um código Unicode) | char (16 bits, UTF-16) |
| Texto | string | String (é uma classe, não um primitivo) |
Estática × dinâmica, forte × fraca
- Estática (Go, Java): o tipo de cada variável é conhecido na compilação, e erros de tipo nem compilam.
- Dinâmica (Python, JavaScript): o tipo é verificado durante a execução.
- Forte: a linguagem não converte tipos sozinha de forma surpreendente (Go não deixa somar
intcomfloat64sem conversão explícita). - Fraca: converte implicitamente (
"1" + 1em JavaScript dá"11").
Cuidado: overflow silencioso
Cada inteiro tem um limite. Ao passar dele, o valor “dá a volta” sem erro:
var x int32 = math.MaxInt32 // 2147483647x++fmt.Println(x) // -2147483648int x = Integer.MAX_VALUE; // 2147483647x++;System.out.println(x); // -2147483648Para valores que podem crescer (contadores, dinheiro em centavos), use int64/long. Em Java, Math.addExact lança exceção em vez de dar a volta.
Veja também: Variáveis e constantes, Strings e tipos em Go.