Menu
Coddy logo textTech

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 []string

To 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]
4

Pamię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]
4

Ale pojemność pozostaje taka sama. Zwróć więc na to uwagę: długość nie zawsze jest równa pojemności."

challenge icon

Wyzwanie

Łatwy

W 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

Poćwicz samodzielnie: Kompilator Go online