arrays - semiestructurados - Ir a la matriz y cortar los tipos de datos
tipos de datos estructurados en programacion (4)
Soy nuevo en el lenguaje Go. Me encontré confundido con los tipos de datos de array
y slice
.
Desde Go docs, las matrices se describen de la siguiente manera:
Existen grandes diferencias entre las formas en que las matrices funcionan en Go y C. In Go,
- Las matrices son valores. Al asignar una matriz a otra se copian todos los elementos.
- En particular, si pasa una matriz a una función, recibirá una copia de la matriz, no un puntero a ella.
- El tamaño de una matriz es parte de su tipo. Los tipos [10] int y [20] int son distintos.
Funciones:
Como en todos los idiomas de la familia C, todo en Go pasa por valor. Es decir, una función siempre obtiene una copia de lo que se pasa, como si hubiera una instrucción de asignación que asignara el valor al parámetro. Por ejemplo, pasar un valor int a una función hace una copia del int, y pasar un valor de puntero hace una copia del puntero, pero no los datos a los que apunta.
¿Por qué sort.Ints(arrayValue)
modifica la variable pasada cuando la declare como una matriz, no como una porción?
Código
var av = []int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
return
Salida
[1 5 2 3 7]
[1 2 3 5 7]
Consulte " Rebanadas: uso e internos "
var av = []int{1,5,2,3,7}
Eso es una rebanada, no una matriz.
Un literal de división se declara como un literal de matriz, excepto que se omite el recuento de elementos.
Eso explica por qué la función de clasificación modificará el contenido de lo que hace referencia el sector.
Como comenta más abajo Kirk , sort.Ints
le dará un error si le pasó una matriz en lugar de una porción.
func Ints(a []int)
Porque estás usando una porción, no una matriz.
Eso es una rebanada:
var av = []int{1,5,2,3,7}
Y esas son matrices:
var av = [...]int{1,5,2,3,7}
var bv = [5]int{1,5,2,3,7}
Si intenta compilar:
var av = [...]int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
, obtendrás un error:
no se puede usar av (tipo [5] int) como tipo [] int en argumento de función
como sort.Ints espera recibir un segmento [] int .
[]int{1,5,2,3,7}
no es una matriz. Una matriz tiene su longitud en su tipo, como [5]int{1,5,2,3,7}
.
Haga una copia de la porción y ordénela en su lugar:
a := []int{1,5,2,3,7}
sortedA := make([]int, len(a))
copy(sortedA, a)
sort.Ints(sortedA)
fmt.Println(a)
fmt.Println(sortedA)
var av = []int{1,5,2,3,7}
en la declaración anterior estás inicializando slice como una matriz
Para crear una matriz, la sintaxis debe ser
var av = [5]int{1,5,2,3,7}