2016-04-18 14 views
9

Próbując dowiedzieć się jechać z samouczka teraz i mieć ładny pytanie podstawowe:Idź plastry - pojemność/długość?

func main() { 
    a := make([]int, 5) 
    // [0,0,0,0,0] len=5 cap=5 

    b := make([]int, 0, 5) 
    // [] len=0 cap=5 

    c := b[:2] 
    // [0,0] len=2 cap=5 

    d := c[2:5] 
    // [0,0,0] len=3 cap=3 
} 

Dlaczego c wyglądać [0,0] i mają długość 2? b początkowo nie był zerowany, a więc []. Czy ustawienie c na b[:2] wyzeruje dwa pierwsze elementy?

Ponadto, dlaczego jest pojemność d 3? Bardzo zdezorientowany.

Z góry dziękuję.

+3

może się okazać przydatny następujący artykuł: https://blog.golang.org/ plasterki – kostya

+3

Ostatnie pytanie: pojemność, to liczba elementów między pierwszym elementem, do którego można uzyskać dostęp, a ostatnim elementem tablicy. Pierwszy element, do którego dostęp ma "d", to drugi element w podstawowej macierzy, a więc pojemność wynosi 3. – Akavall

+1

Prawdopodobny duplikat [Zmniejszanie pojemności plasterka] (http://stackoverflow.com/questions/43294449/decreasing-slice-capacity) –

Odpowiedz

7

Wszystkie zmienne mają slice type. Plasterki mają podłoże array. W Go nie można uzyskać dostępu do niezainicjowanych zmiennych. Jeśli nie podasz jawnie wartości podczas tworzenia nowej zmiennej, zostaną one zainicjowane przy użyciu zero value typu zmiennej.

Oznacza to, że podczas tworzenia plasterka z make([]int, 0, 5), tworzy on również tablicę tylną, tablica podkładowa zostanie zainicjalizowana z wartością zerową, a ta wyzerowana tablica będzie miała postać sliced. Wartość zerowa typu tablicowego jest tablicą o zerowej wartości typu elementu dla każdego z jej elementów.

Więc nawet jeśli nie ustawiłeś jawnie wszystkich elementów tablicy zabezpieczającej na 0, zostaną one wyzerowane automatycznie. Tak więc, gdy wykonasz c := b[:2], pokroisz plaster b, a c będzie miał długość 2, a te 2 elementy będą 0.

A kiedy robisz d := c[2:5] że plasterki c kawałek, jego długość będzie 5-2 = 3, a jego pojemność będzie również 5-2 = 3 bo krojenie kawałek spowoduje nowy kawałek, który akcji tej samej tablicy podkład i pojemność będzie pierwszym elementem do ostatniej z tablicy podkładu (chyba że użyjesz pełnego wycinku , który również kontroluje pojemność wynikowego plasterka).

Musi przeczytać na blogu dla początkujących, którzy chcą zrozumieć plasterki i tablic:

The Go Blog: Go Slices: usage and internals

The Go Blog: Arrays, slices (and strings): The mechanics of 'append'

Powiązane problemy