Korzystanie prosty assignment nie można, bo chociaż pola User
są podzbiorem RegistrationRequest
, są zupełnie 2 różne typy i Assignability zasady nie mają zastosowania.
Można napisać funkcję, która używa odbicia (pakiet reflect
) i skopiowałaby wszystkie pola od req
do u
, ale jest to po prostu brzydkie (i nieefektywne).
Najlepiej byłoby zmienić swoje typy, a RegistrationRequest
może embedUser
.
Robi więc jeśli mają wartość typu RegistrationRequest
Oznacza to, że już też mieć wartość User
:
type User struct {
Email *string
Username *string
Password *string
Name string
}
type RegistrationRequest struct {
User // Embedding User type
Email2 *string
}
func main() {
req := RegistrationRequest{}
s := "[email protected]"
req.Email = &s
s2 := "testuser"
req.Username = &s2
u := User{}
u = req.User
fmt.Println(*u.Username, *u.Email)
}
wyjściowy: (spróbuj na Go Playground)
testuser [email protected]
także proszę Zwróć uwagę, że skoro Twoje konstrukcje zawierają wskaźniki, podczas kopiowania wartości struct
, wartości wskaźników będą kopiowane, a nie wskazywane wartości. Nie jestem pewien, dlaczego potrzebujesz wskazówek tutaj, najlepiej byłoby po prostu zadeklarować, że wszystkie pola nie są wskaźnikami.
Należy również pamiętać, że osadzanie nie jest tak naprawdę wymogiem, tylko sprawia, że twoje typy i ich wykorzystanie jest bardziej płynne. User
może równie dobrze być „zwykłe” pole RequistrationRequest
, np .:
type RegistrationRequest struct {
Usr User // This is just an ordinary field, not embedding
Email2 *string
}
znaczy struct osadzanie? – alexsmn