Go - Slices
Go Slice é uma abstração de Go Array. Go Array permite definir variáveis que podem conter vários itens de dados do mesmo tipo, mas não fornece nenhum método embutido para aumentar seu tamanho dinamicamente ou obter um sub-array próprio. As fatias superam essa limitação. Ele fornece muitas funções de utilitário exigidas no Array e é amplamente usado na programação Go.
Definindo uma fatia
Para definir uma fatia, você pode declará-la como uma matriz sem especificar seu tamanho. Alternativamente, você pode usarmake função para criar uma fatia.
var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/
funções len () e cap ()
Uma fatia é uma abstração sobre array. Na verdade, ele usa arrays como uma estrutura subjacente. olen() função retorna os elementos presentes na fatia onde cap()função retorna a capacidade da fatia (ou seja, quantos elementos ela pode acomodar). O exemplo a seguir explica o uso de fatia -
package main
import "fmt"
func main() {
var numbers = make([]int,3,5)
printSlice(numbers)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
len = 3 cap = 5 slice = [0 0 0]
Fatia nula
Se uma fatia for declarada sem entradas, por padrão, ela será inicializada como nula. Seu comprimento e capacidade são zero. Por exemplo -
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
if(numbers == nil){
fmt.Printf("slice is nil")
}
}
func printSlice(x []int){
fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
len = 0 cap = 0 slice = []
slice is nil
Sublicenciando
Slice permite que os limites inferior e superior sejam especificados para obter o subforte dele usando[lower-bound:upper-bound]. Por exemplo -
package main
import "fmt"
func main() {
/* create a slice */
numbers := []int{0,1,2,3,4,5,6,7,8}
printSlice(numbers)
/* print the original slice */
fmt.Println("numbers ==", numbers)
/* print the sub slice starting from index 1(included) to index 4(excluded)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
/* missing lower bound implies 0*/
fmt.Println("numbers[:3] ==", numbers[:3])
/* missing upper bound implies len(s)*/
fmt.Println("numbers[4:] ==", numbers[4:])
numbers1 := make([]int,0,5)
printSlice(numbers1)
/* print the sub slice starting from index 0(included) to index 2(excluded) */
number2 := numbers[:2]
printSlice(number2)
/* print the sub slice starting from index 2(included) to index 5(excluded) */
number3 := numbers[2:5]
printSlice(number3)
}
func printSlice(x []int){
fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
len = 9 cap = 9 slice = [0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len = 0 cap = 5 slice = []
len = 2 cap = 9 slice = [0 1]
len = 3 cap = 7 slice = [2 3 4]
Funções append () e copy ()
Pode-se aumentar a capacidade de uma fatia usando o append()função. Usandocopy()função, o conteúdo de uma fatia de origem é copiado para uma fatia de destino. Por exemplo -
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* append allows nil slice */
numbers = append(numbers, 0)
printSlice(numbers)
/* add one element to slice*/
numbers = append(numbers, 1)
printSlice(numbers)
/* add more than one element at a time*/
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* create a slice numbers1 with double the capacity of earlier slice*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* copy content of numbers to numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
len = 0 cap = 0 slice = []
len = 1 cap = 2 slice = [0]
len = 2 cap = 2 slice = [0 1]
len = 5 cap = 8 slice = [0 1 2 3 4]
len = 5 cap = 16 slice = [0 1 2 3 4]