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
Nguồn
2017-10-17 14:32:29
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())' –
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)' –
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