115 lines
2.4 KiB
Go
115 lines
2.4 KiB
Go
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")
|
||
}
|