Detecting address family of net.IP

322 views
Skip to first unread message

goo...@digineo.de

unread,
Jun 16, 2016, 11:02:50 AM6/16/16
to golang-nuts
Hi,

In many software projects I have to get the address family of a net.IP object. I always duplicate the following code:

func isIPv4(ip net.IP) bool {
   
return len(ip) == net.IPv4len || (len(ip) > 11 && isZeros(ip[0:10]) && ip[10] == 0xff && ip[11] == 0xff)
}

func isZeros
(ip net.IP) bool {
   
for _, b := range ip {
       
if b != 0 {
           
return false
       
}
   
}
   
return true
}

Instead it would be very very useful to have a Family(), IsIPv4 or IsIPv6 function on net.IP.
What is your opinion on that?


Paul Borman

unread,
Jun 16, 2016, 11:18:37 AM6/16/16
to goo...@digineo.de, golang-nuts
Do you mean like To4 and To16 that are defined on net.IP?

switch {
case ip.To4() != nil:
    // is an IPv4 address
case ip.To16() != nil:
    // is an IPv6 address
default:
    // is something else
}

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

goo...@digineo.de

unread,
Jun 16, 2016, 9:01:11 PM6/16/16
to golang-nuts, goo...@digineo.de
Ok, that's sufficient for me. It's only dangerous that if you switch the cases (To16() first) it does not work any more.

Paul Borman

unread,
Jun 17, 2016, 10:27:26 AM6/17/16
to goo...@digineo.de, golang-nuts
Yes, To16 gives you a 16 byte version of an IP address, which can be IPv4 or IPv6.  Normally it is sufficient to just call To4 to determine if it is an IPv4 address or not and assume if it is not it must be an IPv6 address:

func IsIPv4(ip net.IP) bool { return ip.To4() != nil }
func IsIPv6(ip net.IP) bool { return ip.To4() == nil } // simple version
func IsIPv6(ip net.IP) bool { return ip.To4() == nil && ip.To16() != nil  } // more robust version

--
Reply all
Reply to author
Forward
0 new messages