| | |
| | | |
| | | func InitWithIP() { |
| | | // 使用 LookupIP 获取主机的 IP 地址列表 |
| | | addrs, err := net.LookupIP("localhost") |
| | | // 获取本机所有网络接口 |
| | | interfaces, err := net.Interfaces() |
| | | if err != nil { |
| | | logx.Errorf("snowflake can not generate, init error, get ip error:%v", err) |
| | | panic(fmt.Sprintf("snowflake can not generate, init error, get ip error:%v", err)) |
| | | } |
| | | var ip string |
| | | // 遍历 IP 地址列表 |
| | | for _, addr := range addrs { |
| | | // 判断 IP 地址的版本是 IPv4 还是 IPv6 |
| | | if ipNet := addr.To4(); ipNet != nil { |
| | | ip = ipNet.String() |
| | | logx.Errorf("IPv4 Address: %s\n", ipNet.String()) |
| | | } |
| | | logx.Errorf("snowflake InitWithIP error:%v", err) |
| | | return |
| | | } |
| | | |
| | | var ip string |
| | | // 遍历所有网络接口 |
| | | for _, iface := range interfaces { |
| | | // 排除一些特殊的接口,例如 loopback 接口 |
| | | if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 { |
| | | // 获取接口的所有地址 |
| | | addrs, err := iface.Addrs() |
| | | if err != nil { |
| | | logx.Errorf("snowflake InitWithIP error:%v", err) |
| | | continue |
| | | } |
| | | // 遍历接口的所有地址 |
| | | for _, addr := range addrs { |
| | | // 检查地址类型是否是 IP 地址 |
| | | if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { |
| | | // 判断 IP 地址的版本是 IPv4 还是 IPv6 |
| | | if ipNet.IP.To4() != nil { |
| | | fmt.Printf("IPv4 Address: %s\n", ipNet.IP.String()) |
| | | if ipNet.IP.String() != "127.0.0.1" { |
| | | ip = ipNet.IP.String() |
| | | goto getIpOK |
| | | } |
| | | } else { |
| | | fmt.Printf("IPv6 Address: %s\n", ipNet.IP.String()) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | getIpOK: |
| | | if ip == "" { |
| | | logx.Errorf("snowflake InitWithIP can not find Ip") |
| | | return |
| | | } |
| | | ipNumber, err := ipToNumber(ip) |
| | | if err != nil { |
| | | logx.Errorf("snowflake can not generate, init error, ip to number error :%v", err) |