transfer_middleware/until/common/func.go

115 lines
2.4 KiB
Go
Raw Normal View History

2024-06-07 11:11:04 +08:00
package common
import (
"crypto/md5"
"encoding/hex"
"fmt"
"net"
2024-06-07 11:11:04 +08:00
"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")
}