utilizzando semplici assignment non è possibile perché, anche se i campi di User
sono un sottoinsieme di RegistrationRequest
, sono completamente 2 tipi diversi, e Assignability regole non si applicano.
È possibile scrivere una funzione che utilizza la riflessione (pacchetto reflect
) e copierà tutti i campi da req
a u
, ma è solo brutto (e inefficiente).
Il migliore sarebbe il refactoring dei tipi e RegistrationRequest
embedUser
.
In questo modo, se si dispone di un valore di tipo RegistrationRequest
che significa che già hanno anche un valore di 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)
}
uscita: (provate sul Go Playground)
testuser [email protected]
Inoltre si prega di si noti che poiché le strutture contengono puntatori, quando si copia un struct
, i valori del puntatore verranno copiati e non i valori puntati. Non sono sicuro del motivo per cui hai bisogno di indicazioni qui, sarebbe meglio dichiarare tutti i campi come non puntatori.
Inoltre, l'incorporamento non è un requisito, ma rende i tipi e il loro utilizzo più semplici. User
potrebbe benissimo essere un campo di "ordinario" di RequistrationRequest
, ad es .:
type RegistrationRequest struct {
Usr User // This is just an ordinary field, not embedding
Email2 *string
}
vuoi dire struct incorporamento? – alexsmn