package common import ( "crypto/md5" "encoding/hex" "fmt" "net" "reflect" "strings" ) func GetMD5Hash(input string) string { hash := md5.Sum([]byte(input)) return hex.EncodeToString(hash[:]) } // toMap 将结构体转换为map[string]interface{} // StructToMap 将一个struct转换为map[string]interface{} func StructToMap(obj interface{}) map[string]interface{} { // 获取obj的类型 val := reflect.ValueOf(obj) if val.Kind() == reflect.Ptr { val = val.Elem() } // 确保obj是一个struct if val.Kind() != reflect.Struct { return nil } // 创建一个map来保存结果 data := make(map[string]interface{}) // 遍历struct的字段 for i := 0; i < val.NumField(); i++ { // 获取字段的类型和值 valueField := val.Field(i) typeField := val.Type().Field(i) jsonTag := typeField.Tag.Get("json") if idx := strings.Index(jsonTag, ","); idx != -1 { // 如果有逗号,则取逗号之前的部分 jsonTag = jsonTag[:idx] } // 忽略未导出的字段(字段名首字母小写) if !typeField.IsExported() { continue } // 将字段名和值添加到map中 data[jsonTag] = valueField.Interface() } return data } // mergeMaps 合并任意数量的map func MergeMaps(maps ...map[string]interface{}) map[string]interface{} { merged := make(map[string]interface{}) for _, m := range maps { for k, v := range m { merged[k] = v } } return merged } // 判断一个IP地址是否是私有(局域网)IP地址 func isPrivateIP(ip net.IP) bool { privateIPBlocks := []*net.IPNet{ {IP: net.ParseIP("10.0.0.0"), Mask: net.CIDRMask(8, 32)}, {IP: net.ParseIP("172.16.0.0"), Mask: net.CIDRMask(12, 32)}, {IP: net.ParseIP("192.168.0.0"), Mask: net.CIDRMask(16, 32)}, // 如果需要IPv6私有地址,可以在这里添加 } for _, block := range privateIPBlocks { if block.Contains(ip) { return true } } return false } func GetLocalIP() (string, error) { interfaces, err := net.Interfaces() if err != nil { return "", err } for _, iface := range interfaces { addrs, err := iface.Addrs() if err != nil { continue } for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } // 忽略IPv6地址和回环地址(127.0.0.1) if ip.To4() != nil && !ip.IsLoopback() && isPrivateIP(ip) { return ip.String(), nil } } } return "", fmt.Errorf("no local IP address found") }