func Send(sock *os.File, message *Message) error {
	sockFd := int(sock.Fd())
	return syscall.Sendmsg(sockFd, message.Data, makeRights(message), nil, 0)
}
Send sends file descriptors to Unix domain socket.

Please note that the number of descriptors in one message is limited
and is rather small.
Use conn.File() to get a file if you want to put a network connection.
package ipc
import (
	"os"
	"strconv"
	"syscall"
)
type Message struct {
	Data  []byte
	Files []*os.File
}
func Recv(sock *os.File, buff []byte, fdCaps int) (int, []*os.File, error) {
	sockFd := int(sock.Fd())
	var mbuf []byte
	mbuf = make([]byte, syscall.CmsgSpace(fdCaps*4))
	n, oobn, _, _, err := syscall.Recvmsg(sockFd, buff, mbuf, 0)
	if err != nil {
		return 0, nil, err
	}
	files, err := parseCmsg(oobn, mbuf)
	if err != nil {
		return 0, nil, err
	}
	return n, files, nil
}
func parseCmsg(oobn int, mbuf []byte) ([]*os.File, error) {
	if oobn == 0 {
		return []*os.File{}, nil
	}
	var msgs []syscall.SocketControlMessage
	msgs, err := syscall.ParseSocketControlMessage(mbuf[:oobn])
	if err != nil {
		return nil, err
	}
	files := make([]*os.File, 0, len(msgs))
	for i := 0; i < len(msgs) && err == nil; i++ {
		var fds []int
		fds, err = syscall.ParseUnixRights(&msgs[i])
		for _, fd := range fds {
			files = append(files, os.NewFile(uintptr(fd), "@/go2node/fd/"+strconv.Itoa(fd)))
		}
	}
	return files, nil
}