Tipos compostos
Coleções embutidas
Coleções armazenam itens de um tipo pré-determinado, e permitem o acesso a cada item individualmente.
Go tem apenas 4 tipos de coleção embutidas:
tipo | descrição | len(x) |
cap(x) |
pode ser nil |
inicializado por make |
---|---|---|---|---|---|
array |
sequência pré-alocada de valores | fixo | fixo | não | não |
slice |
janela sobre um array interno |
variável | fixo | sim | sim |
map |
dicionário (hash table) | variável | N/A | sim | sim |
channel |
fila FIFO manipulada com operador <- |
variável | fixo | sim | sim |
🔍 Arrays são tratados como valores: todo o seu conteúdo é copiado na atribuição e na passagem como argumento de função, não importa se o tamanho do
array
é 1 byte ou 1 terabyte. Variáveis dos tiposslice
,map
echannel
se comportam como referências: o conteúdo é compartilhado. Por esse motivo, é comum ver ponteiros para arrays, mas é raro ver ponteiros paraslice
,map
ouchannel
.
📖 Leitura essencial sobre slices: Go Slices: usage and internals.
Exemplos
Array
📖 Fonte: https://gobyexample.com/arrays
package main
import "fmt"
func main() {
var a [5]int
fmt.Println("emp:", a)
a[4] = 100
fmt.Println("set:", a)
fmt.Println("get:", a[4])
fmt.Println("len:", len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println("dcl:", b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
Slice
📖 Fonte: https://gobyexample.com/slices
package main
import "fmt"
func main() {
s := make([]string, 3)
fmt.Println("emp:", s)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("set:", s)
fmt.Println("get:", s[2])
fmt.Println("len:", len(s))
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("apd:", s)
c := make([]string, len(s))
copy(c, s)
fmt.Println("cpy:", c)
l := s[2:5]
fmt.Println("sl1:", l)
l = s[:5]
fmt.Println("sl2:", l)
l = s[2:]
fmt.Println("sl3:", l)
t := []string{"g", "h", "i"}
fmt.Println("dcl:", t)
twoD := make([][]int, 3)
for i := 0; i < 3; i++ {
innerLen := i + 1
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
}
Map
📖 Fonte: https://gobyexample.com/maps
package main
import "fmt"
func main() {
m := make(map[string]int)
m["k1"] = 7
m["k2"] = 13
fmt.Println("map:", m)
v1 := m["k1"]
fmt.Println("v1: ", v1)
fmt.Println("len:", len(m))
delete(m, "k2")
fmt.Println("map:", m)
_, prs := m["k2"]
fmt.Println("prs:", prs)
n := map[string]int{"foo": 1, "bar": 2}
fmt.Println("map:", n)
}
Channel
📖 Fonte: https://gobyexample.com/channels
package main
import "fmt"
func main() {
messages := make(chan string)
go func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
}