Thật tuyệt khi Go có một Duration
loại - có các đơn vị được xác định rõ ràng có thể ngăn chặn các vấn đề trong thế giới thực.
Và do quy tắc loại nghiêm ngặt của Go, bạn không thể nhân Thời lượng với số nguyên - bạn phải sử dụng một nhóm để nhân các loại phổ biến.
/*
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'
}
Các tài liệu chính thức cho thấy sử dụng phương pháp # 1:
Để chuyển đổi số nguyên đơn vị thành Thời lượng, nhân:
seconds := 10
fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
Nhưng, tất nhiên, nhân một thời lượng với một khoảng thời gian sẽ không tạo ra thời lượng - điều đó là vô nghĩa trên mặt của nó. Trường hợp tại điểm, 5 mili giây nhân với 5 mili giây tạo ra 6h56m40s
. Cố gắng bình phương 5 giây sẽ dẫn đến tràn (và thậm chí sẽ không biên dịch nếu được thực hiện với các hằng số).
Nhân tiện, việc int64
biểu diễn tính Duration
bằng nano giây "giới hạn thời gian biểu diễn lớn nhất trong khoảng 290 năm" và điều này cho thấy Duration
, giống như int64
, được coi là một giá trị đã ký: (1<<(64-1))/(1e9*60*60*24*365.25) ~= 292
và đó chính xác là cách nó được thực hiện:
// 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
Vì vậy, bởi vì chúng ta biết rằng biểu diễn cơ bản của Duration
là một int64
, thực hiện phân vai giữa int64
và Duration
là một NO-OP hợp lý - chỉ cần để đáp ứng các quy tắc ngôn ngữ về các kiểu trộn và nó không có tác dụng đối với hoạt động nhân tiếp theo.
Nếu bạn không thích buổi casting vì lý do thuần khiết, hãy chôn nó trong một cuộc gọi chức năng như tôi đã trình bày ở trên.
rand.Seed(time.Now().Unix())