wp-go/helper/number/number.go

101 lines
1.4 KiB
Go
Raw Normal View History

2023-01-21 11:31:23 +00:00
package number
import (
"fmt"
"math/rand"
2023-01-28 13:38:34 +00:00
"time"
2023-01-21 11:31:23 +00:00
)
2023-01-28 13:38:34 +00:00
var _ = func() any {
rand.Seed(time.Now().UnixNano())
return nil
}()
2023-01-21 11:31:23 +00:00
type IntNumber interface {
~int | ~int64 | ~int32 | ~int8 | ~int16 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64
}
2023-01-27 15:48:48 +00:00
type Number interface {
IntNumber | ~float64 | ~float32
}
2023-01-21 11:31:23 +00:00
func Range[T IntNumber](start, end, step T) []T {
if step == 0 {
panic("step can't be 0")
}
l := int((end-start+1)/step + 1)
if l < 0 {
l = 0 - l
}
r := make([]T, 0, l)
for i := start; ; {
r = append(r, i)
i = i + step
if (step > 0 && i > end) || (step < 0 && i < end) {
break
}
}
return r
}
2023-01-27 15:48:48 +00:00
// Rand 都为闭区间 [start,end]
2023-01-21 11:31:23 +00:00
func Rand[T IntNumber](start, end T) T {
end++
return T(rand.Int63n(int64(end-start))) + start
}
2023-01-27 15:48:48 +00:00
func Min[T Number](a ...T) T {
2023-01-21 11:31:23 +00:00
min := a[0]
for _, t := range a {
if min > t {
min = t
}
}
return min
}
2023-01-27 15:48:48 +00:00
func Max[T Number](a ...T) T {
2023-01-21 11:31:23 +00:00
max := a[0]
for _, t := range a {
if max < t {
max = t
}
}
return max
}
2023-01-27 15:48:48 +00:00
func Sum[T Number](a ...T) T {
2023-01-21 11:31:23 +00:00
s := T(0)
for _, t := range a {
s += t
}
return s
}
2023-01-27 15:48:48 +00:00
func Add[T Number](i, j T) T {
return i + j
}
2023-01-28 13:38:34 +00:00
func Sub[T Number](i, j T) T {
return i - j
}
2023-01-27 15:48:48 +00:00
func ToString[T Number](n T) string {
2023-01-21 11:31:23 +00:00
return fmt.Sprintf("%v", n)
}
2023-01-27 15:48:48 +00:00
func Abs[T Number](n T) T {
if n >= 0 {
return n
}
return -n
}
2023-01-28 13:38:34 +00:00
func Mul[T Number](i, j T) T {
return i * j
}
func Divide[T Number](i, j T) T {
return i / j
}