Veo mucho código en Ir para detectar nulo, así:
if err != nil {
// handle the error
}
Sin embargo, tengo una estructura como esta:
type Config struct {
host string
port float64
}
y config es una instancia de Config, cuando lo hago:
if config == nil {
}
hay un error de compilación que dice: no se puede convertir nil para escribir Config
Respuestas:
El compilador le está señalando el error, está comparando una instancia de estructura y nula. No son del mismo tipo, por lo que lo considera como una comparación no válida y le grita.
Lo que desea hacer aquí es comparar un puntero a su instancia de configuración con nil, que es una comparación válida. Para hacerlo, puede usar el nuevo programa incorporado de golang o inicializar un puntero:
o
o
Entonces podrás comprobar si
fuente
var config &Config // nil
debería ser:var config *Config
var config *Config
se estrella coninvalid memory address or nil pointer dereference
. Tal vez necesitamosvar config Config
Además de Oleiade, vea la especificación de valores cero :
Como puede ver,
nil
no es el valor cero para cada tipo, sino solo para punteros, funciones, interfaces, sectores, canales y mapas. Esta es la razón por la cualconfig == nil
es un error y&config == nil
no lo es.Para comprobar si su estructura está sin inicializar que tendría que comprobar todos los miembros de su respectivo valor de cero (por ejemplo
host == ""
,port == 0
, etc.) o tienen un campo privado que se configura mediante un método de inicialización interna. Ejemplo:fuente
time.Time
tiene unIsZero()
método. Sin embargo también se puede hacervar t1 time.Time; if t1 == time.Time{}
y usted podría también hacerif config == Config{}
para comprobar todo el campo para usted (igualdad estructura está bien definido en Ir). Sin embargo, eso no es eficiente si tiene muchos campos. Y, tal vez el valor cero es un valor razonable y utilizable, por lo que pasar uno no es especial.func (c *Config) Initialized() bool { return !(c == nil) }
He creado un código de muestra que crea nuevas variables usando una variedad de formas en las que puedo pensar. Parece que las primeras 3 formas crean valores, y las dos últimas crean referencias.
que salidas:
fuente
También puedes consultar como
struct_var == (struct{})
. Esto no le permite comparar a cero, pero sí verifica si se inicializa o no. Tenga cuidado al usar este método. Si su estructura puede tener valores cero para todos sus campos, no lo pasará en grande.http://play.golang.org/p/RXcE06chxE
fuente
La especificación del lenguaje menciona los comportamientos de los operadores de comparación:
operadores de comparación
Asignabilidad
fuente
En Go 1.13 y posterior, puede usar el
Value.IsZero
método ofrecido en elreflect
paquete.Además de los tipos básicos, también funciona para Array, Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer y Struct. Vea esto como referencia.
fuente