गो में आप फ़ील्ड के लिए डिफ़ॉल्ट मानों को परिभाषित नहीं कर सकते हैं, जब एक नया स्ट्रक्चर वैल्यू बनाया जाता है तो वे हमेशा उनके प्रकार के शून्य-मान होंगे (जब तक कि आप एक समग्र शाब्दिक का उपयोग नहीं करते जहां आप स्पष्ट रूप से एक अलग मान दे सकते हैं)।
तो एक विकल्प यह होगा कि कंस्ट्रक्टर जैसा फंक्शन बनाया जाए NewUser()
जो इस फ़ील्ड को सेट करेगा, और हमेशा नए उपयोगकर्ता बनाने के लिए इस फ़ंक्शन का उपयोग करेगा:
func NewUser() *User {
return &User{
CreatedAt: time.Now(),
}
}
बेशक इसे मजबूर नहीं किया जा सकता है, और यह भी User
. का टाइमस्टैम्प रखेगा स्ट्रक्चर वैल्यू क्रिएशन और तब नहीं जब इसे सेव किया जाता है।
एक और, बेहतर तरीका यह है कि कस्टम मार्शलिंग लॉजिक का उपयोग किया जाए।
आप 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
कीवर्ड एक नया प्रकार बनाता है, और यह अंतर्निहित प्रकार के तरीकों को "विरासत" नहीं करता है)।
ध्यान दें कि यह समाधान CreatedAt
. को भी अधिलेखित (पुनः सेट) कर देगा फ़ील्ड) भले ही आप किसी User
. को फिर से सहेजना चाहते हों . इसलिए हमें एक चेक जोड़ना चाहिए कि क्या CreatedAt
फ़ील्ड भरा हुआ है, और इसे केवल तभी सेट करें जब यह शून्य मान हो:
func (u *User) GetBSON() (interface{}, error) {
if u.CreatedAt.IsZero() {
u.CreatedAt = time.Now()
}
type my *User
return my(u), nil
}
संबंधित/समान प्रश्न भी देखें:जाओ से MongoDB को एक्सेस करना