tour slices postgres golang array arrays go slice

arrays - postgres - golang tour slices



Rebanar rebanadas en Golang (2)

Hace poco recogí el Go, y ahora lo confundí con el siguiente código:

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) }

Y el resultado:

a len=5 cap=5 [0 0 0 0 0] b len=0 cap=5 [] c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead d len=3 cap=3 [0 0 0]

Cualquier ayuda sería gracias.


Tenga en cuenta que en la versión 1.2 ( Q4 2013, 1.2rc1 ya está disponible ), puede asociar a una porción de su propia capacidad (en lugar de una capacidad deducida de la matriz subyacente).

Consulte " Rebanadas de tres índices " y el documento de diseño .

Una operación de segmentación crea una nueva división al describir una sección contigua de una matriz o división ya creada:

var array [10]int slice := array[2:4]

La capacidad de la división es el número máximo de elementos que la división puede contener, incluso después de resecar; refleja el tamaño de la matriz subyacente.
En este ejemplo, la capacidad de la variable de división es 8.

(capacidad de la matriz subyacente menos la posición del inicio del sector en la matriz)

array : [0 0 0 0 0 0 0 0 0 0] array : <---- capacity ---> slice : [0 0] slice : <-- capacity --> 8 (10-2)

Go 1.2 agrega nueva sintaxis para permitir que una operación de segmentación especifique la capacidad y la longitud .
Un segundo signo de dos puntos introduce el valor de capacidad, que debe ser menor o igual a la capacidad de la división o matriz de origen, ajustada para el origen .

Por ejemplo,

slice = array[2:4:6] array : [0 0 0 0 0 0 0 0 0 0] array : <---- capacity ---> 10 slice : [0 0] slice : <- cap-> 4 (6-2)

establece que la división tenga la misma longitud que en el ejemplo anterior, pero su capacidad ahora es de solo 4 elementos (6-2).
Es imposible usar este nuevo valor de división para acceder a los dos últimos elementos de la matriz original .

El argumento principal es dar a los programadores más control sobre la aplicación.

a[i : j : k]

Esa rebanada tiene:

  • índices a partir de 0
  • la longitud es igual a j - i
  • la capacidad es igual a k - i

El pánico de la evaluación si i <= j <= k <= cap(a) no es verdadero .


c es una porción tomada de la matriz b . Esto no es una copia, sino solo una ventana sobre los 2 primeros elementos de b .

Como b tiene una capacidad de 5, c podría extenderse para tomar los otros 3 lugares (de hecho, hace una nueva porción pero sobre el mismo lugar en la memoria).

La capacidad máxima de la división es la capacidad de la matriz subyacente menos la posición del inicio de la división en la matriz:

array : [0 0 0 0 0 0 0 0 0 0 0 0] array : <---- capacity ---> slice : [0 0 0 0] slice : <---- capacity --->

Tal vez este programa deje más claro que c y d son solo ventanas sobre b:

func main() { b := make([]int, 0, 5) c := b[:2] d := c[1:5] // this is equivalent to d := b[1:5] d[0] = 1 printSlice("c", c) printSlice("d", d) }

Salida:

c len=2 cap=5 [0 1] // modifying d has modified c d len=4 cap=4 [1 0 0 0]