Емкость ломтика - PullRequest
       2

Емкость ломтика

0 голосов
/ 04 октября 2018

Я новичок на Голанге и слежу за Туром.Приведенный ниже код дает следующие результаты:

a len = 5 cap = 5 [0 0 0 0 0]

b len = 0 cap = 5 []

clen = 2 cap = 5 [0 0]

d len = 3 cap = 3 [0 0 0]

Как может c иметь такой же колпачок, как b, если он вообще не был указан?

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)

    b := make([]int, 0, 5)
    printSlice("b", b)

    c := b[:2]
    printSlice("c", c)

    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x)
}

1 Ответ

0 голосов
/ 04 октября 2018

Каждый фрагмент представляет собой тип указателя, который указывает на базовый массив.Когда вы делаете b, вы создаете базовый массив, на который указывает b.Когда вы создаете c путем повторного наложения b, вы создаете новый срез, который указывает на тот же базовый массив, что и b.

Когда вы измените некоторые записи в b, вы заметите, что эти значения также изменились и в c.

Существует официальная запись в блоге, которая объясняет все это подробно: https://blog.golang.org/go-slices-usage-and-internals

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...