Files
golang/golang-learning/08-packages/utils/helper.go
2025-08-24 13:01:09 +08:00

320 lines
6.5 KiB
Go

/*
Package utils 提供一些实用的辅助函数
这是一个示例包,用于演示包的创建和使用。
包含了数学计算、字符串处理、数据验证等常用功能。
使用示例:
import "your-module/08-packages/utils"
result := utils.Add(1, 2)
greeting := utils.GetGreeting("World")
*/
package utils
import (
"fmt"
"math"
"regexp"
"strings"
"time"
)
// 包级别的常量
const (
// MaxRetries 最大重试次数
MaxRetries = 3
// DefaultTimeout 默认超时时间
DefaultTimeout = 30 * time.Second
// Version 包版本
Version = "1.0.0"
)
// 包级别的变量
var (
// PackageVersion 包版本(可修改)
PackageVersion = "1.0.0"
// emailRegex 邮箱验证正则表达式
emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
)
// ========== 数学计算函数 ==========
// Add 计算两个整数的和
// 注意:函数名首字母大写,表示这是一个导出的(公开的)函数
func Add(a, b int) int {
return a + b
}
// Subtract 计算两个整数的差
func Subtract(a, b int) int {
return a - b
}
// Multiply 计算两个整数的乘积
func Multiply(a, b int) int {
return a * b
}
// Divide 计算两个数的商,返回结果和错误
func Divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("除数不能为零")
}
return a / b, nil
}
// Max 返回两个整数中的较大值
func Max(a, b int) int {
if a > b {
return a
}
return b
}
// Min 返回两个整数中的较小值
func Min(a, b int) int {
if a < b {
return a
}
return b
}
// Abs 返回整数的绝对值
func Abs(n int) int {
if n < 0 {
return -n
}
return n
}
// Power 计算 base 的 exp 次方
func Power(base, exp int) int {
result := 1
for i := 0; i < exp; i++ {
result *= base
}
return result
}
// ========== 字符串处理函数 ==========
// greet 是一个私有函数(首字母小写)
// 只能在包内部使用,外部无法访问
func greet(name string) string {
return fmt.Sprintf("Hello, %s!", name)
}
// GetGreeting 是一个公开函数,内部调用私有函数
func GetGreeting(name string) string {
return greet(name)
}
// Capitalize 将字符串首字母大写
func Capitalize(s string) string {
if len(s) == 0 {
return s
}
return strings.ToUpper(s[:1]) + strings.ToLower(s[1:])
}
// Reverse 反转字符串
func Reverse(s string) string {
runes := []rune(s)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
// IsPalindrome 检查字符串是否为回文
func IsPalindrome(s string) bool {
s = strings.ToLower(strings.ReplaceAll(s, " ", ""))
return s == Reverse(s)
}
// WordCount 统计字符串中的单词数量
func WordCount(s string) int {
words := strings.Fields(s)
return len(words)
}
// ========== 数据验证函数 ==========
// IsEmail 验证邮箱地址格式
func IsEmail(email string) bool {
return emailRegex.MatchString(email)
}
// IsEmpty 检查字符串是否为空或只包含空白字符
func IsEmpty(s string) bool {
return strings.TrimSpace(s) == ""
}
// InRange 检查数字是否在指定范围内
func InRange(value, min, max int) bool {
return value >= min && value <= max
}
// IsPositive 检查数字是否为正数
func IsPositive(n int) bool {
return n > 0
}
// IsEven 检查数字是否为偶数
func IsEven(n int) bool {
return n%2 == 0
}
// IsOdd 检查数字是否为奇数
func IsOdd(n int) bool {
return n%2 != 0
}
// ========== 切片操作函数 ==========
// Contains 检查切片是否包含指定元素
func Contains(slice []int, item int) bool {
for _, v := range slice {
if v == item {
return true
}
}
return false
}
// ContainsString 检查字符串切片是否包含指定字符串
func ContainsString(slice []string, item string) bool {
for _, v := range slice {
if v == item {
return true
}
}
return false
}
// RemoveDuplicates 移除整数切片中的重复元素
func RemoveDuplicates(slice []int) []int {
keys := make(map[int]bool)
var result []int
for _, item := range slice {
if !keys[item] {
keys[item] = true
result = append(result, item)
}
}
return result
}
// Sum 计算整数切片的总和
func Sum(slice []int) int {
total := 0
for _, v := range slice {
total += v
}
return total
}
// Average 计算整数切片的平均值
func Average(slice []int) float64 {
if len(slice) == 0 {
return 0
}
return float64(Sum(slice)) / float64(len(slice))
}
// ========== 时间处理函数 ==========
// FormatDuration 格式化时间间隔
func FormatDuration(d time.Duration) string {
if d < time.Minute {
return fmt.Sprintf("%.1f秒", d.Seconds())
} else if d < time.Hour {
return fmt.Sprintf("%.1f分钟", d.Minutes())
} else if d < 24*time.Hour {
return fmt.Sprintf("%.1f小时", d.Hours())
} else {
return fmt.Sprintf("%.1f天", d.Hours()/24)
}
}
// IsWeekend 检查给定日期是否为周末
func IsWeekend(t time.Time) bool {
weekday := t.Weekday()
return weekday == time.Saturday || weekday == time.Sunday
}
// DaysUntil 计算距离指定日期还有多少天
func DaysUntil(target time.Time) int {
now := time.Now()
diff := target.Sub(now)
return int(math.Ceil(diff.Hours() / 24))
}
// ========== 类型定义 ==========
// Point 表示二维坐标点
type Point struct {
X, Y float64
}
// Distance 计算两点之间的距离
func (p Point) Distance(other Point) float64 {
dx := p.X - other.X
dy := p.Y - other.Y
return math.Sqrt(dx*dx + dy*dy)
}
// String 实现 Stringer 接口
func (p Point) String() string {
return fmt.Sprintf("Point(%.2f, %.2f)", p.X, p.Y)
}
// Rectangle 表示矩形
type Rectangle struct {
Width, Height float64
}
// Area 计算矩形面积
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// Perimeter 计算矩形周长
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
// String 实现 Stringer 接口
func (r Rectangle) String() string {
return fmt.Sprintf("Rectangle(%.2fx%.2f)", r.Width, r.Height)
}
// ========== 错误类型 ==========
// ValidationError 表示验证错误
type ValidationError struct {
Field string
Message string
}
// Error 实现 error 接口
func (e ValidationError) Error() string {
return fmt.Sprintf("验证错误 [%s]: %s", e.Field, e.Message)
}
// ========== 包初始化函数 ==========
// init 函数在包被导入时自动执行
func init() {
// 可以在这里进行包的初始化工作
// 例如:设置默认值、验证环境等
fmt.Printf("utils 包已加载,版本: %s\n", Version)
}