zhangqian
2023-12-08 e673885c64d5645c2c38e10ddfd922657afdc4cb
pkg/snowflake/snowflake.go
@@ -23,21 +23,47 @@
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)