This worked:
func main() {
ipv4Addr := &net.UDPAddr{IP: net.IPv4(224, 0, 31, 1), Port: 14310}
conn, err := net.ListenUDP("udp4", ipv4Addr)
if err != nil {
fmt.Printf("ListenUDP error %v\n", err)
return
}
pc := ipv4.NewPacketConn(conn)
iface, err := net.InterfaceByName("bond0.181")
if err != nil {
fmt.Printf("can't find specified interface %v\n", err)
return
}
if err := pc.JoinGroup(iface, &net.UDPAddr{IP: net.IPv4(224, 0, 31, 1)}); err != nil {
return
}
buf := make([]byte, 1024)
for {
if n, addr, err := conn.ReadFrom(buf); err != nil {
fmt.Printf("error %v", err)
} else {
println(n, addr)
}
}
return
}