यह अच्छा है कि गो के पास एक Duration
प्रकार है - स्पष्ट रूप से परिभाषित इकाइयां होने से वास्तविक दुनिया की समस्याओं को रोका जा सकता है।
और गो के सख्त प्रकार के नियमों के कारण, आप एक पूर्णांक द्वारा अवधि को गुणा नहीं कर सकते हैं - आपको सामान्य प्रकार को गुणा करने के लिए एक कास्ट का उपयोग करना होगा ।
/*
MultiplyDuration Hide semantically invalid duration math behind a function
*/
func MultiplyDuration(factor int64, d time.Duration) time.Duration {
return time.Duration(factor) * d // method 1 -- multiply in 'Duration'
// return time.Duration(factor * int64(d)) // method 2 -- multiply in 'int64'
}
आधिकारिक दस्तावेज विधि # 1 का उपयोग को दर्शाता है:
किसी पूर्णांक संख्या को एक अवधि में बदलने के लिए, गुणा करें:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
लेकिन, निश्चित रूप से, एक अवधि को अवधि से गुणा करना एक अवधि का उत्पादन नहीं करना चाहिए - यह इसके चेहरे पर बकवास है। बिंदु में मामला, 5 मिलीसेकंड बार 5 मिलीसेकंड का उत्पादन करता है 6h56m40s
। 5 सेकंड के वर्ग में प्रयास करने का परिणाम एक अतिप्रवाह होता है (और यह भी संकलित नहीं किया जाएगा यदि स्थिरांक के साथ किया जाता है)।
वैसे, नैनोसेकंड का int64
प्रतिनिधित्व "सबसे अधिक प्रतिनिधित्व करने योग्य अवधि को लगभग 290 वर्षों तक सीमित करता है" , और यह इंगित करता है कि , जैसे , एक हस्ताक्षरित मूल्य के रूप में व्यवहार किया जाता है: और यह वास्तव में इसे कैसे लागू किया जाता है:Duration
Duration
int64
(1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
// A Duration represents the elapsed time between two instants
// as an int64 nanosecond count. The representation limits the
// largest representable duration to approximately 290 years.
type Duration int64
इसलिए, क्योंकि हम जानते हैं कि अंतर्निहित प्रतिनिधित्व Duration
एक है int64
, कलाकारों के बीच प्रदर्शन करना int64
और Duration
एक समझदार NO- ओपी है - केवल मिश्रण प्रकारों के बारे में भाषा नियमों को संतुष्ट करने के लिए आवश्यक है, और इसके बाद के गुणन ऑपरेशन पर इसका कोई प्रभाव नहीं है।
यदि आपको शुद्धता के कारणों के लिए कास्टिंग पसंद नहीं है, तो इसे फ़ंक्शन कॉल में दफन कर दें जैसा कि मैंने ऊपर दिखाया है।
rand.Seed(time.Now().Unix())