Goでは、フィールドのデフォルト値を定義できません。新しい構造体値が作成されると、フィールドは常にそのタイプのゼロ値になります(別の値を明示的に指定できる複合リテラルを使用する場合を除く)。
>
したがって、1つのオプションは、コンストラクターのような関数NewUser()を作成することです。 これにより、このフィールドが設定され、常にこの関数を使用して新しいユーザーが作成されます。
func NewUser() *User {
return &User{
CreatedAt: time.Now(),
}
}
もちろん、これを強制することはできません。また、これはUserのタイムスタンプを保持します。 保存時ではなく、構造体の値の作成。
もう1つのより良いアプローチは、カスタムマーシャリングロジックを使用することです。
bson.Getterを実装することで、カスタムマーシャリングロジックを記述できます。 。 GetBSON() 実際に保存される値を提供する責任があります。同じUserが必要です 保存するインスタンス、そのCreatedAt 前に設定されたフィールド:
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
}
新しいmy タイプが作成されて返されます。これは、スタックオーバーフローを回避するためです。タイプ*Userの値を返すだけです bson.Getterを実装しているため、悪いです 、したがってGetBSON() 延々と呼ばれるでしょう。新しいmy typeにはこのメソッドがないため、無限の「再帰」は発生しません(type キーワードは新しいタイプを作成し、基になるタイプのメソッドを「継承」しません。
このソリューションは、CreatedAtも上書き(リセット)することに注意してください。 フィールド)Userを再保存したい場合でも 。したがって、CreatedAtかどうかのチェックを追加する必要があります フィールドに入力し、ゼロ値の場合にのみ設定します:
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
関連する/同様の質問も参照してください:GoからMongoDBにアクセスする