Ответ 1
Используя простой assignment, вы не можете, потому что, хотя поля User
являются подмножеством RegistrationRequest
, они полностью 2 разных типа, а Assignability правила не применяются.
Вы можете написать функцию, которая использует отражение (reflect
package) и скопирует все поля из req
в u
, но это просто уродливо (и неэффективно).
Лучше всего было бы реорганизовать ваши типы, а RegistrationRequest
мог embed User
.
Выполняя это, если у вас есть значение типа RegistrationRequest
, это означает, что у вас уже есть значение 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)
}
Выход: (попробуйте на Go Playground)
testuser [email protected]
Также обратите внимание, что поскольку ваши структуры содержат указатели, при копировании struct
значения указателя будут скопированы и не указаны. Я не уверен, почему вам нужны указатели здесь, было бы лучше всего объявить все поля не указателями.
Также обратите внимание, что внедрение не является требованием, оно просто делает ваши типы и их использование более плавными. User
также может быть "обычным" полем RequistrationRequest
, например:
type RegistrationRequest struct {
Usr User // This is just an ordinary field, not embedding
Email2 *string
}