In Go kun je geen standaardwaarden voor velden definiëren, ze zullen altijd de nulwaarde van hun type zijn wanneer een nieuwe structwaarde wordt gemaakt (tenzij je een samengestelde letterlijke waarde gebruikt waar je expliciet een andere waarde kunt geven).
Dus een optie zou zijn om een constructor-achtige functie te maken NewUser()
die dit veld zou instellen, en altijd deze functie gebruiken om nieuwe gebruikers aan te maken:
func NewUser() *User {
return &User{
CreatedAt: time.Now(),
}
}
Dit kan natuurlijk niet worden geforceerd, en dit zal ook de tijdstempel van de User
bevatten struct waardecreatie en niet wanneer het wordt opgeslagen.
Een andere, betere benadering is om een aangepaste marshaling-logica te gebruiken.
U kunt aangepaste marshaling-logica schrijven door bson.Getter
. te implementeren . GetBSON()
is verantwoordelijk voor het leveren van een waarde die daadwerkelijk wordt bespaard. We willen dezelfde User
instantie die moet worden opgeslagen, alleen de CreatedAt
veld eerder ingesteld:
type User struct {
CreatedAt time.Time `json:"created_at" bson:"created_at"`
}
func (u *User) GetBSON() (interface{}, error) {
u.CreatedAt = time.Now()
type my *User
return my(u), nil
}
Merk op dat een nieuwe my
type wordt gemaakt en geretourneerd. De reden hiervoor is om stack overflow te voorkomen. Gewoon een waarde van het type *User
returning retourneren is slecht, omdat het bson.Getter
. implementeert , dus GetBSON()
eindeloos zou worden gebeld. De nieuwe my
type heeft deze methode niet, dus eindeloze "recursie" gebeurt niet (het type
trefwoord maakt een nieuw type aan en het "erft" geen methoden van het onderliggende type).
Merk op dat deze oplossing ook de CreatedAt
. zal overschrijven (opnieuw instellen) veld) zelfs als u alleen een User
opnieuw wilt opslaan . We moeten dus een controle toevoegen of de CreatedAt
veld is gevuld en stel het alleen in als het de nulwaarde is:
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
Zie ook gerelateerde/vergelijkbare vraag:MongoDB openen vanuit Go