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にアクセスする