Pojemność wycinka
Lekcja 7 z 21 w kursie Slice’y i mapy w Go w Coddy.
Jedną z rzeczy, które mogą być mylące podczas pracy z wycinkami, jest różnica między długością a pojemnością. W tej lekcji dowiemy się, czym jest pojemność wycinka.
Dobrze, zaczynajmy. Ta deklaracja tworzy nowy wycinek, taki jak ten:
var names []stringTo nowy wycinek, więc nie ma tablicy bazowej, a zatem wszystkie jego pola mają wartość zero.
Gdy użyjemy funkcji <strong>len</strong> lub funkcji <strong>cap</strong> dla tego wycinka, obie zwrócą 0. Jeśli jednak zamiast tego użyję literału wycinka, tym razem Go utworzy nową tablicę bazową:
names := []string{"Python", "Java", "Rust"}W tym ostatnim literałe znajdują się trzy elementy, dlatego tablica bazowa wycinka <strong>names</strong> również ma trzy elementy. Pojemność to zatem długość tablicy bazowej wycinka, a nie długość samego wycinka.
Aby lepiej to zrozumieć, przyjrzyjmy się kolejnemu przykładowi:
names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:]A więc zastanów się: jaka będzie pojemność wycinka <strong>nameSlice</strong> w tym przykładzie?
Odpowiedź to 4. Zaczynamy od indeksu 1 i przechodzimy do końca wycinka, co możemy sprawdzić:
names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:]
fmt.Println(nameSlice)
fmt.Println(cap(nameSlice))Wynik będzie następujący:
[Golang Rust JavaScript Haskell]
4Pamiętaj więc, że aby obliczyć pojemność, zaczynamy od pierwszej pozycji i przechodzimy do końca wycinka.
Nawet jeśli zrobimy coś takiego:
names := []string{"Python", "Golang", "Rust", "JavaScript", "Haskell"}
nameSlice := names[1:4]
fmt.Println(nameSlice)
fmt.Println(cap(nameSlice))Tutaj długość się zmienia i otrzymujemy tylko <strong>trzy elementy</strong>:
[Golang Rust JavaScript]
4Ale pojemność pozostaje taka sama. Zwróć więc na to uwagę: długość nie zawsze jest równa pojemności."
Wyzwanie
ŁatwyW podanym kodzie definiujemy wycinek zawierający 10 elementów.
- Wykonaj wycinanie, aby utworzyć kolejny wycinek, i wyświetl jego pojemność na ekranie. Powinna być równa 6.
Spróbuj swoich sił
package main
import (
"fmt"
)
func main() {
// Wycinek zawierający 10 elementów
lang := []string{"Python", "Java", "JavaScript", "C++", "Go", "Ruby", "Swift", "Rust", "PHP", "Kotlin"}
// Wykonaj tutaj wycinanie
// Uzupełnij funkcję Print
fmt.Println("the capacity of this Slice is :" ?)
}Wszystkie lekcje w sekcji Slice’y i mapy w Go
1Wprowadzenie
WprowadzeniePoćwicz samodzielnie: Kompilator Go online