Widzę dużo kodu w Go, aby wykryć zero, na przykład:
if err != nil {
// handle the error
}
jednak mam taką strukturę:
type Config struct {
host string
port float64
}
a config to instancja Config, kiedy robię:
if config == nil {
}
występuje błąd kompilacji, który mówi: nie można przekonwertować nil na typ Config
Odpowiedzi:
Kompilator wskazuje na błąd, porównujesz instancję struktury i zero. Nie są tego samego typu, więc uważa to za nieprawidłowe porównanie i wrzeszczy na ciebie.
To, co chcesz tutaj zrobić, to porównać wskaźnik do twojej instancji config do zera, co jest poprawnym porównaniem. Aby to zrobić, możesz albo użyć nowego wbudowanego golang , albo zainicjować do niego wskaźnik:
lub
lub
Wtedy będziesz mógł sprawdzić, czy
źródło
var config &Config // nil
powinno być:var config *Config
var config *Config
awarie zinvalid memory address or nil pointer dereference
. Może potrzebujemyvar config Config
Oprócz Oleiade zapoznaj się ze specyfikacją dotyczącą wartości zerowych :
Jak widać,
nil
nie jest to wartość zerowa dla każdego typu, ale tylko dla wskaźników, funkcji, interfejsów, wycinków, kanałów i map. To jest powód, dla któregoconfig == nil
jest to błąd, a&config == nil
nie jest.Aby sprawdzić, czy struktura jest niezainicjowanymi trzeba by sprawdzić każdy element do odpowiedniej wartości zerowej (np
host == ""
,port == 0
etc.) lub dysponują pola, która jest tworzona przez wewnętrzne metody inicjalizacji. Przykład:źródło
time.Time
maIsZero()
metodę. Jednak można również zrobićvar t1 time.Time; if t1 == time.Time{}
i mógł również zrobićif config == Config{}
, aby sprawdzić wszystkie pola dla Ciebie (równość struktura jest dobrze zdefiniowane w Go). Jednak nie jest to wydajne, jeśli masz dużo pól. I być może wartość zero jest rozsądną i użyteczną wartością, więc przekazywanie jedynki nie jest czymś wyjątkowym.func (c *Config) Initialized() bool { return !(c == nil) }
Stworzyłem przykładowy kod, który tworzy nowe zmienne na wiele różnych sposobów. Wygląda na to, że pierwsze 3 sposoby tworzą wartości, a dwa ostatnie tworzą odwołania.
które wyjścia:
źródło
Możesz też sprawdzić jak
struct_var == (struct{})
. To nie pozwala na porównywanie do zera, ale sprawdza, czy jest zainicjowany, czy nie. Zachowaj ostrożność podczas korzystania z tej metody. Jeśli twoja struktura może mieć zerowe wartości dla wszystkich swoich pól, nie będziesz się dobrze bawić.http://play.golang.org/p/RXcE06chxE
źródło
Specyfikacja języka wspomina o zachowaniach operatorów porównania:
operatory porównania
Przypisywalność
źródło
W Go 1.13 i późniejszych możesz użyć
Value.IsZero
metody oferowanej wreflect
pakiecie.Oprócz podstawowych typów działa również dla Array, Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer i Struct. Zobacz to w celach informacyjnych.
źródło