2013-07-10 9 views
119

समवर्ती goroutines परीक्षण करने के लिए, मैं इसे वापस करने के लिए (एक दूसरे के लिए)पूर्णांक द्वारा अवधि को गुणा कैसे करें?

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

हालांकि एक यादृच्छिक समय लेने के लिए बनाने के लिए जब मैं संकलित एक समारोह के लिए एक लाइन कहा, मैं यह त्रुटि आई

\ crawler.go:। 49: अवैध संचालन: rand.Int31n (1000) * time.Millisecond (बेमेल प्रकार int32 और time.Duration)

कोई भी विचार? मैं एक अवधि कैसे गुणा कर सकता हूं?

उत्तर

175

int32 और time.Duration विभिन्न प्रकार हैं। आपको int32 को time.Duration, जैसे time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond) में कनवर्ट करने की आवश्यकता है।

+3

धन्यवाद जो काम करता है। मैंने यादृच्छिक संख्या जनरेटर 'रैंड को बीजिंग के बारे में भी सीखा। सईद (समय.अब() यूनिक्स()) –

+11

सिर्फ मेरे ज्ञान के लिए, निम्नलिखित कार्य कैसे करते हैं? 'समय। सो जाओ (समय। दूसरा * 2)' –

+23

यह काम करता है क्योंकि स्थिरांक का उपयोग अनुकूली प्रकार है, इस पर आधारित है कि उनका उपयोग कैसे किया जाता है। रोब पाइक द्वारा इस ब्लॉग पोस्ट को देखें जो इसे विस्तार से समझाता है: http://blog.golang.org/constants – mna

18

आपको इसे सही प्रारूप Playground पर डालना होगा।

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

आप sleep के दस्तावेज़ देखने करेंगे, तो आप देखते हैं कि यह एक पैरामीटर के रूप func Sleep(d Duration) अवधि की आवश्यकता है। आपका rand.Int31nint32 देता है।

उदाहरण से लाइन (time.Sleep(100 * time.Millisecond)) की रेखा है क्योंकि संकलक यह समझने के लिए पर्याप्त स्मार्ट है कि यहां आपके constant 100 का अर्थ है। लेकिन यदि आप एक चर पारित करते हैं, तो आपको इसे कास्ट करना चाहिए।

0

गो में, आप एक ही प्रकार के चर गुणा कर सकते हैं, इसलिए आपको अभिव्यक्ति के दोनों हिस्सों को एक ही प्रकार की आवश्यकता होनी चाहिए।

सबसे सरल चीज जो आप कर सकते हैं वह गुणा करने से पहले अवधि के लिए एक पूर्णांक कास्टिंग कर रहा है, लेकिन यह यूनिट सेमेन्टिक्स का उल्लंघन करेगा। इकाइयों की अवधि में अवधि के दौरान अवधि का गुणा क्या होगा?

मैं नहीं बल्कि एक int64 को time.Millisecond परिवर्तित करना चाहते हैं, और उसके बाद मिलीसेकेंड की संख्या से गुणा करें, तो time.Duration लिए डाली:

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

इस तरह अभिव्यक्ति के किसी भी हिस्से में कहा जा सकता इसके प्रकार के अनुसार एक सार्थक मूल्य है। int64(time.Millisecond) भाग केवल एक आयामी मान है - मूल मूल्य में समय की छोटी इकाइयों की संख्या।

तो एक से थोड़ा सरल रास्ता चलना:

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

गुणन के बाएं हिस्से बकवास है - प्रकार "time.Duration" का मान, अपने प्रकार के लिए कुछ अप्रासंगिक पकड़े:

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/#Duration

सेकंड: = 10

fmt.Print (समय। अवधि (सेकंड) * समय। दूसरा) // प्रिंट 10s

संबंधित मुद्दे