2013-07-10 39 views
119

Để kiểm tra goroutines đồng thời, tôi đã thêm một dòng vào một chức năng để làm cho nó mất một thời gian ngẫu nhiên để trở lại (lên đến một giây)Cách nhân thời lượng theo số nguyên?

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

Tuy nhiên khi tôi biên soạn, tôi đã nhận lỗi này

. \ Crawler.go: 49: hoạt động không hợp lệ: rand.Int31n (1000) * time.Millisecond (các loại không khớp int32 và time.Duration)

Bất kỳ ý tưởng nào? Làm thế nào tôi có thể nhân một thời gian?

Trả lời

175

int32time.Duration là các loại khác nhau. Bạn cần chuyển đổi số int32 thành số time.Duration, chẳng hạn như time.Sleep(time.Duration(rand.Int31n(1000)) * time.Millisecond).

+3

Cảm ơn bạn đã làm việc. Tôi cũng đã học về việc tạo ra trình tạo số ngẫu nhiên 'rand.Seed (time.Now(). Unix())' –

+11

chỉ vì kiến ​​thức của tôi, công việc sau đây như thế nào? 'time.Sleep (time.Second * 2)' –

+23

Nó hoạt động bởi vì các hằng số có kiểu thích ứng, dựa trên cách chúng được sử dụng. Xem bài đăng trên blog này của Rob Pike giải thích chi tiết: http://blog.golang.org/constants – mna

18

Bạn phải truyền sang định dạng chính xác Playground.

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

Nếu bạn sẽ kiểm tra tài liệu cho sleep, bạn sẽ thấy rằng nó đòi hỏi func Sleep(d Duration) thời gian như một tham số. rand.Int31n trả lại int32 của bạn.

Dòng từ ví dụ hoạt động (time.Sleep(100 * time.Millisecond)) vì trình biên dịch đủ thông minh để hiểu rằng ở đây, constant 100 của bạn có nghĩa là một khoảng thời gian. Nhưng nếu bạn vượt qua một biến, bạn nên bỏ nó.

0

Trong Go, bạn có thể nhân các biến cùng loại, vì vậy bạn cần phải có cả hai phần của biểu thức cùng loại.

Điều đơn giản nhất bạn có thể làm là truyền một số nguyên thành thời lượng trước khi nhân, nhưng điều đó sẽ vi phạm ngữ nghĩa của đơn vị. Điều gì sẽ được nhân thời gian theo thời gian trong thời hạn của đơn vị?

Tôi muốn chuyển đổi time.Millisecond một Int64, và sau đó nhân với số mili giây, sau đó đúc để time.Duration:

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

Bằng cách này bất kỳ phần nào của biểu thức có thể nói để có một giá trị có ý nghĩa theo loại của nó. Phần int64(time.Millisecond) chỉ là một giá trị không thứ nguyên - số đơn vị thời gian nhỏ nhất trong giá trị ban đầu.

Nếu đi một con đường hơi đơn giản:

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

Phần bên trái của phép nhân là vô nghĩa - một giá trị kiểu "time.Duration", giữ một cái gì đó không liên quan đến loại của nó:

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

Và nó không chỉ là ngữ nghĩa, có chức năng thực tế liên kết với các loại. Mã này in:

100ns 
100ms 

Điều thú vị là các mẫu mã ở đây sử dụng mã đơn giản nhất, với ngữ nghĩa sai lầm tương tự chuyển đổi Thời gian: https://golang.org/pkg/time/#Duration

giây: = 10

fmt.Print (time.Duration (giây) * time.Second) // in 10s

Các vấn đề liên quan