code: func JoinMulticastIPv6(c *net.IPConn, gaddr, laddr net.IP) error {
  	f, err := c.File()
  	if err != nil {
  		return err
  	}
  	defer f.Close()
  
  	mreq := &syscall.IPv6Mreq{}
  	copy(mreq.Multiaddr[:], gaddr.To16())
  	iface, err := findInterface(laddr)
  	if err != nil {
  		return err
  	}
  	mreq.Interface = uint32(iface.Index)
  
  	err = syscall.SetsockoptIPv6Mreq(int(f.Fd()), syscall.IPPROTO_IPV6, syscall.IPV6_JOIN_GROUP, mreq)
  	if err != nil {
  		return err
  	}
  	return nil
  }
docs: // JoinMulticastIPv6 joins the multicast group address given by gaddr. laddr specifies which
  // network interface to use when joining the group.