এটি দুর্দান্ত যে গো এর একটি Duration
প্রকার রয়েছে - সুস্পষ্টভাবে সংজ্ঞায়িত ইউনিট থাকা সত্যিকারের সমস্যাগুলি রোধ করতে পারে।
এবং গো-এর কঠোর প্রকারের বিধিগুলির কারণে আপনি কোনও পূর্ণসংখ্যার দ্বারা একটি সময়কালকে গুণ করতে পারবেন না - সাধারণ ধরণের সংখ্যাগুলিকে গুণ করতে আপনাকে অবশ্যই একটি castালাই ব্যবহার করতে হবে ।
/*
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
, এর মধ্যে castালাই সম্পাদন করা int64
এবং Duration
একটি বুদ্ধিমান নো-ওপি - কেবল মিশ্রণের প্রকারের ভাষা সংক্রান্ত নিয়মগুলি পূরণ করার জন্য প্রয়োজনীয় এবং পরবর্তী গুনের ক্রিয়াকলাপে এর কোনও প্রভাব নেই।
আপনি যদি বিশুদ্ধতার কারণে কাস্টিং পছন্দ না করেন তবে এটি উপরে ফাংশন কলের মধ্যে কবর দিন।
rand.Seed(time.Now().Unix())