পূর্ণসংখ্যা দ্বারা সময়কালকে কীভাবে বৃদ্ধি করবেন?


284

একযোগে গোরোটাইন পরীক্ষা করার জন্য, আমি ফাংশনে একটি লাইন যুক্ত করেছি যাতে এটি ফিরে আসতে এলোমেলো সময় নেয় (এক সেকেন্ড পর্যন্ত)

time.Sleep(rand.Int31n(1000) * time.Millisecond)

তবে আমি যখন সংকলন করলাম তখন আমি এই ত্রুটিটি পেয়েছি

কোন ধারনা? আমি কীভাবে একটি সময়কালকে গুণতে পারি?

উত্তর:


431

int32এবং time.Durationবিভিন্ন ধরণের। আপনাকে এটিকে রূপান্তর করতে int32হবে time.Duration, যেমন time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond)


5
ধন্যবাদ যে কাজ করেছে। আমি এলোমেলো নম্বর জেনারেটর বীজ সম্পর্কেও শিখেছিrand.Seed(time.Now().Unix())
কর্নেল প্যানিক

44
কেবল আমার জ্ঞানের জন্য, নিম্নলিখিতগুলি কীভাবে কাজ করবে? time.Sleep(time.Second * 2)
hanশান খারে

59
এটি কাজ করে কারণ ধ্রুবকগুলির কীভাবে ব্যবহৃত হয় তার উপর ভিত্তি করে একটি অভিযোজক ধরনের রয়েছে। রব পাইকের এই ব্লগ পোস্টটি দেখুন যা এটিকে বিশদভাবে ব্যাখ্যা করে: blog.golang.org/constants
এমএনএ

28
এই তার সরল টাইপ সিস্টেম কারণে বারেই সেই অদ্ভুত জিনিস এক আছে (এই ক্ষেত্রে ওভারলোডিং অপারেটর অভাব) - আপনাকে গুণ নিক্ষেপ করে থাক Duration* Duration= Durationপরিবর্তে মূল এক যা আসলে আরো ইন্দ্রিয় তোলে: Duration* int= Duration
টিমম্ম্ম

14
ভাল হয় অপারেটর ওভারলোডিং বা অন্তর্নিহিত সংখ্যার রূপান্তর এই কাজটি করতে দেয়। আমি মনে করি তারা সংখ্যাসূচক রূপান্তরটি বাইরে রেখেই ঠিক ছিল। এটিকে পিছনে দেখার পরে যা int64(...) * Durationকাস্টিংয়ের চেয়ে অনেক বেশি বোঝা যায় Durationযা ইউনিটগুলি কীভাবে কাজ করা উচিত তা কেবলমাত্র একটি লঙ্ঘন। দুঃখজনকভাবে যে কাজ করে না। আপনাকে সত্যই এটি করতে হবে Duration * Durationযা ভয়ঙ্কর।
টিএমএমএম

59

আপনাকে এটি একটি সঠিক ফর্ম্যাটে কাস্ট করতে হবে Playground

yourTime := rand.Int31n(1000)
time.Sleep(time.Duration(yourTime) * time.Millisecond)

আপনি যদি ঘুমের জন্য ডকুমেন্টেশন পরীক্ষা করেন , আপনি দেখতে পাচ্ছেন যে এটির জন্য func Sleep(d Duration)প্যারামিটার হিসাবে সময়কাল প্রয়োজন । আপনার র‌্যান্ড.আইএনটিএন 31 ফিরে আসে int32

উদাহরণ থেকে লাইনটি কাজ করে ( time.Sleep(100 * time.Millisecond)) কারণ সংকলকটি বুঝতে যথেষ্ট স্মার্ট যে এখানে আপনার ধ্রুবক 100 এর অর্থ একটি সময়কাল। তবে আপনি যদি কোনও ভেরিয়েবল পাস করেন তবে আপনার এটি করা উচিত।


16

গো-তে আপনি একই ধরণের ভেরিয়েবলগুলি গুণ করতে পারেন, সুতরাং আপনার উভয় অংশেরই একই প্রকারের প্রয়োজন।

আপনি যা করতে পারেন সবচেয়ে সহজ কাজটি হ'ল গুণকের আগে সময়কালে একটি পূর্ণসংখ্যা কাস্টিং হয় তবে এটি ইউনিট শব্দার্থবিজ্ঞান লঙ্ঘন করে। ইউনিটের মেয়াদে সময়কাল দ্বারা গুন কত হবে?

আমি বরং সময়কে রূপান্তর করব illমিলিসেকেন্ডকে একটি ইন্টু 64৪ তে এবং তারপরে এটিকে মিলি সেকেন্ডের সংখ্যায় গুণিত করুন, তারপরে সময় নিক্ষেপ করুন D সময়কাল:

time.Duration(int64(time.Millisecond) * int64(rand.Int31n(1000)))

এইভাবে অভিব্যক্তির যে কোনও অংশের ধরণ অনুসারে তার অর্থ অনুসারে একটি অর্থপূর্ণ মান থাকতে পারে। int64(time.Millisecond)অংশটি মাত্র একটি মাত্রাবিহীন মান - মূল মানের সময়ে ক্ষুদ্রতম এককের সংখ্যা।

যদি কিছুটা সরল পথে হাঁটেন:

time.Duration(rand.Int31n(1000)) * time.Millisecond

গুণনের বাম অংশটি অযৌক্তিক - "টাইম.ডায়ুরিশন" টাইপের একটি মান, যা এর প্রকারের সাথে অপ্রাসঙ্গিক কিছু রাখে:

numberOfMilliseconds := 100
// just can't come up with a name for following:
someLHS := time.Duration(numberOfMilliseconds)
fmt.Println(someLHS)
fmt.Println(someLHS*time.Millisecond)

এবং এটি কেবল শব্দার্থবিজ্ঞানের নয়, প্রকারের সাথে সম্পর্কিত প্রকৃত কার্যকারিতা রয়েছে। এই কোড মুদ্রণ:

100ns
100ms

মজার বিষয় হচ্ছে, এখানে কোড নমুনা সময়কালের রূপান্তরটির একই বিভ্রান্তিকর অর্থশাস্ত্র সহ সহজ কোডটি ব্যবহার করে: https://golang.org/pkg/time/#D अवधि

সেকেন্ড: = 10

এফএমটি.প্রিন্ট (সময়। সময়কাল (সেকেন্ড) * সময়.সেকেন্ড) // 10 টি প্রিন্ট করে


5

এটি দুর্দান্ত যে গো এর একটি 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 বছরের মধ্যে সীমাবদ্ধ করে" এবং এটি সূচিত করে যে , এর মতো , একটি স্বাক্ষরিত মান হিসাবে গণ্য করা হয়: এবং ঠিক এটিই প্রয়োগ করা হয়:DurationDurationint64(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একটি বুদ্ধিমান নো-ওপি - কেবল মিশ্রণের প্রকারের ভাষা সংক্রান্ত নিয়মগুলি পূরণ করার জন্য প্রয়োজনীয় এবং পরবর্তী গুনের ক্রিয়াকলাপে এর কোনও প্রভাব নেই।

আপনি যদি বিশুদ্ধতার কারণে কাস্টিং পছন্দ না করেন তবে এটি উপরে ফাংশন কলের মধ্যে কবর দিন।


" সাধারণ ধরণের হিসাবে / হিসাবে গুণিত করুন "।
nobar

এখানে (ভুল) উত্তরে বিভাগ সম্পর্কিত সম্পর্কিত একই আলোচনা ।
নোবার

-3

সময় পরিবর্তনশীল এর গুণনের জন্য। নিম্নলিখিত কোড ব্যবহার করে দ্বিতীয়

    oneHr:=3600
    addOneHrDuration :=time.Duration(oneHr)
    addOneHrCurrTime := time.Now().Add(addOneHrDuration*time.Second)

এটি গো এর time.Durationভেরিয়েবলগুলি ব্যবহার করার ভাল উপায় নয় । আপনি আপনার addOneHrDurationসময়ের পরিবর্তনশীলটির নাম দিন time.Durationকিন্তু তারপরে এটি এক ঘন্টা না হয়ে 3600 এনএসে সেট করতে এগিয়ে যান। একটি time.Durationন্যানোসেকেন্ড বেস ইউনিট আছে ঘটবে। আসলে এক ঘন্টার সময়কাল পেতে আপনি যেমন কিছু করতে পারেন: const oneHourDuration = 60 * time.Hour( 3600 * time.Secondবা time.Hour) or
ডেভ সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.