In Go können Sie keine Standardwerte für Felder definieren, sie sind immer der Nullwert ihres Typs, wenn ein neuer Strukturwert erstellt wird (es sei denn, Sie verwenden ein zusammengesetztes Literal, bei dem Sie explizit einen anderen Wert angeben können).
Eine Möglichkeit wäre also, eine Konstruktor-ähnliche Funktion NewUser()
zu erstellen die dieses Feld setzen würden, und immer diese Funktion verwenden, um neue Benutzer anzulegen:
func NewUser() *User {
return &User{
CreatedAt: time.Now(),
}
}
Dies kann natürlich nicht erzwungen werden und enthält auch den Zeitstempel des User
struct Wertschöpfung und nicht beim Speichern.
Ein anderer, besserer Ansatz ist die Verwendung einer benutzerdefinierten Marshalling-Logik.
Sie können benutzerdefinierte Marshalling-Logik schreiben, indem Sie bson.Getter
implementieren . GetBSON()
ist dafür verantwortlich, einen Wert bereitzustellen, der tatsächlich gespeichert wird. Wir wollen denselben User
zu speichernde Instanz, nur deren CreatedAt
Feldsatz vor:
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
}
Beachten Sie, dass ein neuer my
Typ wird erstellt und zurückgegeben. Der Grund dafür ist, einen Stapelüberlauf zu vermeiden. Einfach einen Wert vom Typ *User
zurückgeben ist schlecht, weil es bson.Getter
implementiert , also GetBSON()
würde endlos angerufen werden. Das neue my
type hat diese Methode nicht, also findet keine endlose "Rekursion" statt (der type
-Schlüsselwort erstellt einen neuen Typ und "erbt" keine Methoden des zugrunde liegenden Typs).
Beachten Sie, dass diese Lösung auch CreatedAt
überschreibt (zurücksetzt). Feld), auch wenn Sie nur einen User
neu speichern möchten . Wir sollten also eine Prüfung hinzufügen, ob die CreatedAt
Feld gefüllt ist, und setzen Sie es nur, wenn es der Wert Null ist:
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
Siehe auch verwandte / ähnliche Frage:Zugriff auf MongoDB von Go