From the go source code on potential conflicts in IP Addressing schemes: https://cs.opensource.google/go/go/+/master:src/net/rawconn_unix_test.go
// There's no guarantee that IP-level socket
// options work well with dual stack sockets.
// A simple solution would be to take a look
// at the bound address to the raw connection
// and to classify the address family of the
// underlying socket by the bound address:
//
// - When IP.To16() != nil and IP.To4() == nil,
// we can assume that the raw connection
// consists of an IPv6 socket using only
// IPv6 addresses.
//
// - When IP.To16() == nil and IP.To4() != nil,
// the raw connection consists of an IPv4
// socket using only IPv4 addresses.
//
// - Otherwise, the raw connection is a dual
// stack socket, an IPv6 socket using IPv6
// addresses including IPv4-mapped or
// IPv4-embedded IPv6 addresses.