package util import ( "bytes" "errors" "net" "strconv" "unsafe" ) // 获取本机网卡IP func GetLocalIP(networkName string) (ipv4 string, mask string, err error) { interfaces, err := net.Interfaces() if err != nil { return "", "", err } for _, i := range interfaces { byName, err := net.InterfaceByName(i.Name) if err != nil { return "", "", err } addresses, err := byName.Addrs() for _, v := range addresses { if ipnet, ok := v.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { if byName.Name == networkName { maskStr := ipnet.Mask.String() mask64, _ := strconv.ParseUint(maskStr, 16, 32) return ipnet.IP.String(), IpIntToString(int(mask64)), nil } } } } } return "", "", errors.New("ipv4 not found") } func IpIntToString(ipInt int) string { ipSegs := make([]string, 4) var len int = len(ipSegs) buffer := bytes.NewBufferString("") for i := 0; i < len; i++ { tempInt := ipInt & 0xFF ipSegs[len-i-1] = strconv.Itoa(tempInt) ipInt = ipInt >> 8 } for i := 0; i < len; i++ { buffer.WriteString(ipSegs[i]) if i < len-1 { buffer.WriteString(".") } } return buffer.String() } // 判断一个数组是否包含另一个数组的所有元素 func ArrayContains(list []string, arr []string) bool { c := 0 if arr == nil || list == nil { return false } for _, s := range arr { for _, t := range list { if s == t { c++ break } } } return c == len(arr) } func ByteSlice2float32Slice(src []byte) []float32 { if len(src) == 0 { return nil } l := len(src) / 4 ptr := unsafe.Pointer(&src[0]) return (*[1 << 26]float32)((*[1 << 26]float32)(ptr))[:l:l] }