package transport import ( "errors" "fmt" "net" ) var ( errNoIPv4Addr = errors.New("no IPv4 address") errNoIPv6Addr = errors.New("no IPv6 address") ) func resolveIPAddrWithPreference(address string, preferIPv6 bool, exclusive bool) (*net.IPAddr, error) { ips, err := net.LookupIP(address) if err != nil { return nil, err } if preferIPv6 { for _, ip := range ips { if ip.To4() == nil { return &net.IPAddr{IP: ip}, nil } } if exclusive { return nil, errNoIPv6Addr } else { return &net.IPAddr{IP: ips[0]}, nil } } else { // prefer IPv4 for _, ip := range ips { if ip.To4() != nil { return &net.IPAddr{IP: ip}, nil } } if exclusive { return nil, errNoIPv4Addr } else { return &net.IPAddr{IP: ips[0]}, nil } } } func ResolvePreferenceFromString(preference string) (bool, bool, error) { switch preference { case "4": return false, true, nil case "6": return true, true, nil case "46": return false, false, nil case "64": return true, false, nil default: return false, false, fmt.Errorf("%s is not a valid preference", preference) } }