Directorio artículo
prefacio
Hash
Tabla es una estructura de datos inteligente y práctico es una desordenada key/value
colección de pares, en el que la totalidad de la clave es diferente por una dada key
puede ser recuperada en un tiempo constante complejidad, actualizar o borrar la correspondiente value
. Mapa es en realidad una Hash
lista de referencias, puede recuperar rápidamente los datos en base a la clave, la misma tecla que el valor del índice asociado con el punto clave de. Tiene la oportunidad de dar usted habla Map
fondo de las cosas, que le enseña cómo utilizar Map
el enfoque de esta sección es que recordar una cosa: Map
tienda de colección desordenada de pares de clave y valor.
Creación e inicialización
función de hacer uso
make
Puede crear un sector, sino que también puede ser usado para crear Map
. Regla es la siguiente:
m := make(map[keyType]valueType)
Vamos a tratar de crear:
month := make(map[string]int)
month["January"] = 1
month["February"] = 2
month["March"] = 3
La primera línea de código, crear un key
tipo string
, value
el tipo int
de blanco Map
month
, a continuación, a month
asignar los tres pares.
uso literal
El código de seguridad, de manera literal se puede emplear para lograr:
month := map[string]int{"January":1,"February":2,"March":3}
// 还可以写成这样
month := map[string]int{
"January":1,
"February":2,
"March":3,
}
Utilice literales también pueden crear vacíos Map
, aparatos ortopédicos que no están asignados a la misma:
month := map[string]int{}
fmt.Println(month) // 输出:map[]
Libre Map
, no está allí nil
Map
? Prometiendo curso nil
de Map
:
var month map[string]int
fmt.Println(month == nil) // 输出:true
Para nil
los map
que no pueden acceder a pares clave-valor, de lo contrario será error panic: assignment to entry in nil map
. Puede utilizar mencionadas make
funciones, a su inicialización:
var month map[string]int
month = make(map[string]int)
month["January"] = 1
fmt.Println(month) // 输出:map[January:1]
La naturaleza puede pensar, Map
el valor es cero nil
, Map
es decir, los que subyacen a Hash
las tablas de referencia.
Map
El key
puede ser un tipo incorporado, el tipo de estructura puede ser, se puede utilizar siempre y cuando los ==
operadores de comparación, se puede utilizar como key
. Secciones, funciones y estructuras del tipo que comprende secciones, a causa de estos tipos Referencia semántica, no como key
el uso de estos tipos de errores se traducirá en compilación:
month := map[[]string]int{}
// 编译错误:invalid map key type []string
Para Map
en value
él, no habría ninguna restricción sobre el tipo de curso no hay ninguna razón para impedir que los usuarios utilicen el corte como Map
valores:
m := map[string][]int{}
slice := []int{1,2,3}
m["slice"] = slice
fmt.Println(m["slice"])
// 或者
slice := []int{1,2,3}
m := map[string][]int{"slice":slice}
fmt.Println(m["slice"])
Primera pieza de código, crear un key
tipo string
, un valor de slice
tipo nulo Map
, luego corte slice
asignada a la llamada slice
de key
. El segundo párrafo del código es una versión abreviada del primer párrafo del código.
Cómo utilizar el mapa
Map
El uso es muy simple, similar a la matriz, la matriz es utilizar el índice Map
de usar key
para obtener o modificar value
.
m := map[string]int{}
m["January"] = 1 // 赋值
fmt.Println(m) // 输出:map[January:1]
m["January"] = 10 //修改
fmt.Println(m) // 输出:map[January:10]
january := m["January"] // 获取value
fmt.Println(january) // 输出:10
Cuando operación de modificación, si key
ya existe, el nuevo valor sobrescribe el valor anterior, el código anterior se ha manifestado, por lo que key
no se le permite repetir.
Obtiene un inexistente key
en value
el tiempo, volverá a cero los valores correspondientes al tipo, esta vez, no sabemos es que hay un valor cero o pares de valores clave para la que no existe. Afortunadamente, Map
nos proporciona un método:
february,exists := m["February"]
fmt.Println(february,exists) // 输出:0 false
Obtener más valor cuando un valor de retorno, el valor de retorno es el primero value
, el segundo es el valor de retorno boolean
variable de tipo que indica value
si hay o no. Esto nos da un juicio key
si existe proporciona una gran comodidad.
tecla de borrado para borrar
A diferencia Slice
, Go
nos proporciona una clave para la función de eliminación - delete
función.
prototipo:
m := map[string]int{
"January":1,
"February":2,
"March":3,
}
fmt.Println(m) // 输出:map[March:3 January:1 February:2]
delete(m,"January")
fmt.Println(m) // 输出:map[February:2 March:3]
Cuando se elimina un par clave-valor no existe, delete
la función no se queja, no tuvo ningún efecto.
Mapa de recorrido
Map
No se puede usar for
bucle a través de, como una matriz, rebanada, se puede utilizar range
para atravesar.
for key, value := range m {
fmt.Println(key, "=>", value)
}
salida:
February => 2
March => 3
January => 1
operador en blanco puede _
ignorar el retorno key
o value
. Al ejecutar repetidamente el código, se encuentra que el valor de retorno de la orden es probable que no es el mismo, es decir, Map
el recorrido que hay trastorno.
la función len
Puede utilizar len función devuelve el número de pares de clave y valor en el Mapa:
fmt.Println("len(m) =",len(m))
Mapa es un tipo de referencia
Mapa es una referencia a los datos subyacentes . El proceso de codificación, implica Map
copiar, funciones de transferencia entre mapa y similares. Con Slice
similares Map
puntos de datos subyacentes no va a pasar copy
de.
m := map[string]int{
"January":1,
"February":2,
"March":3,
}
month := m
delete(month,"February")
fmt.Println(m)
fmt.Println(month)
salida:
map[January:1 March:3]
map[January:1 March:3]
El código anterior, Map
m
se le asigna a month
, borrar month
un par clave-valor, m
también ha cambiado, lo que indica que Map
la copia, m
y month
compartir los datos subyacentes, en donde uno de los cambios de datos, el otro también cambiará. Del mismo modo, la función de transferencia entre Map
cuando, de hecho, aprobó una Map
referencia a una copia de los datos subyacentes no estará involucrado, si se modifica en la función llamada Map
, en la función de llamada será percibido Map
cambios.
¿Y si realmente quiero copiar Map
cómo hacerlo?
month := map[string]int{}
m := map[string]int{
"January":1,
"February":2,
"March":3,
}
for key,value := range m{
month[key] = value
}
delete(month,"February")
fmt.Println(m)
fmt.Println(month)
salida:
map[January:1 February:2 March:3]
map[January:1 March:3]
El código anterior, utilizamos range
los m
pares de valores clave asignadas al ciclo month
, y luego quitar month
uno de los pares de valores clave, se puede ver por los resultados de la impresión, m
no ha cambiado. Esto permite que una copia fiel.