W Go istnieją różne sposoby zwracania struct
wartości lub jej części. Dla indywidualnych widziałem:
type MyStruct struct {
Val int
}
func myfunc() MyStruct {
return MyStruct{Val: 1}
}
func myfunc() *MyStruct {
return &MyStruct{}
}
func myfunc(s *MyStruct) {
s.Val = 1
}
Rozumiem różnice między nimi. Pierwszy zwraca kopię struktury, drugi wskaźnik do wartości struktury utworzonej w funkcji, trzeci oczekuje, że istniejąca struktura zostanie przekazana i zastępuje wartość.
Widziałem, że wszystkie te wzorce są używane w różnych kontekstach, zastanawiam się, jakie są najlepsze praktyki w odniesieniu do nich. Kiedy użyjesz które? Na przykład pierwszy może być odpowiedni dla małych struktur (ponieważ narzut jest minimalny), drugi dla większych. I trzeci, jeśli chcesz być wyjątkowo wydajnym pod względem pamięci, ponieważ możesz łatwo ponownie użyć jednej instancji struktury między rozmowami. Czy są jakieś najlepsze praktyki dotyczące tego, kiedy stosować?
Podobnie to samo pytanie dotyczące plasterków:
func myfunc() []MyStruct {
return []MyStruct{ MyStruct{Val: 1} }
}
func myfunc() []*MyStruct {
return []MyStruct{ &MyStruct{Val: 1} }
}
func myfunc(s *[]MyStruct) {
*s = []MyStruct{ MyStruct{Val: 1} }
}
func myfunc(s *[]*MyStruct) {
*s = []MyStruct{ &MyStruct{Val: 1} }
}
Ponownie: jakie są tutaj najlepsze praktyki. Wiem, że plasterki są zawsze wskaźnikami, więc zwrócenie wskaźnika do plasterka nie jest przydatne. Jednak czy powinienem zwrócić kawałek wartości struct, kawałek wskaźników do struktur, czy powinienem przekazać wskaźnik do plasterka jako argument (wzorzec używany w API App Engine )?
new(MyStruct)
:) Ale tak naprawdę nie ma różnicy między różnymi metodami przydzielania wskaźników i zwracania ich.