1. Declaración de variable
Para simplemente declarar una variable, puede var
usar la palabra clave, de la siguiente manera:
var s string
Los ejemplos son simplemente declara una variable s
, escribe string
, y no la inicializa, por lo que es string
un valor cero, es decir, "" (la cadena vacía).
Intentemos declarar una variable de tipo puntero, como se muestra a continuación:
var sp *string
El descubrimiento es posible, pero tampoco se ha inicializado, por lo que su valor es del *string
tipo de valor cero, es decir nil
.
2. Inicialización variable
Variable por =
asignación de operador es modificar el valor de la variable. Si asigna un valor a una variable cuando la declara, esta operación se llama inicialización de variable.
Si desea inicializar una variable, hay tres formas.
- Inicializar directamente en la declaración
var s string = "hello"
- Inicializar después de la declaración
var s string
s = "hello"
- Usar
:=
declaración simple
s := "hello"
3. Asignación de diferentes tipos de variables
3.1 Variables de tipo de valor
func main() {
var s string
s = "hello"
fmt.Println(s)
}
Ejecute el código anterior, puede imprimir normalmente, lo que indica que cuando la variable de tipo de valor no está inicializada, no hay problema con la asignación directa.
3.2 ¿Qué pasa con las variables de tipo puntero?
func main() {
var sp *string
*sp = "hello"
fmt.Println(*sp)
}
Ejecute estos códigos, verá el siguiente mensaje de error:
panic: runtime error: invalid memory address or nil pointer dereference
Esto se debe a que si no hay una variable de tipo puntero asigna memoria en el valor predeterminado es cero nil
, no apunta a la memoria, por lo que no se puede usar, el uso de la fuerza obtendrá más que nil
el objetivo incorrecto.
Para los tipos de valor, incluso si solo declara una variable sin inicializarla, la variable tendrá memoria asignada.
En el siguiente ejemplo, declaramos una variable s
, no su inicialización, pero podemos &s
obtener su dirección de memoria. En realidad, este es un Go
lenguaje que nos ayuda a hacer, se puede usar directamente.
func main() {
var s string
fmt.Printf("%p\n",&s)
}
¿Por qué var wg sync.WaitGroup
las declaraciones de variables wg
no se inicializan también se pueden usar directamente?
Debido a que sync.WaitGroup
una struct
estructura es un tipo de valor, el Go
lenguaje asigna memoria automáticamente, puede usarse directamente, no reportar nil
anomalías.
Resumen: Si desea asignar un valor a una variable, la variable debe tener una memoria asignada correspondiente, de modo que pueda operar en esta memoria para completar el propósito de la asignación.
Nota: De hecho, más que una asignación para la variable de puntero, si no hay asignación de memoria, el valor de la operación se reportará como
nil
una excepción, porque la memoria no está operativa.
Por lo tanto, se debe declarar una variable y asignar memoria antes de que se pueda asignar, y luego se puede inicializar cuando se declara. Cuando se declara el tipo de puntero, el Go
idioma no asigna memoria automáticamente, por lo que no se le puede asignar, que es diferente del tipo de valor.
Por lo tanto, map
y chan
también porque son esencialmente también un tipo de puntero.
func main() {
var d map[string]string
d["aa"] = "123"
fmt.Printf("%v\n", d)
}
Error:
panic: assignment to entry in nil map