20210409很不错的golang udp示范并分析udp与net.Conn的关系 - ziyouzy/2021blog GitHub Wiki

https://studygolang.com/articles/9307

而在源代码net.udpsock.go中:

type UDPConn struct {
    conn
}

同时在net.tcpsock.go中:

type TCPConn struct {
    conn
}

由此可知,tcp与udp在这一层面拥有相同的实现逻辑

同时在net.go中不仅仅有Conn,还有conn,区别在于conn是个结构类:

type conn struct {
    fd *netFD
}

并且其实是他实现了net.Conn接口
因此UDPConn与TCPConn也就都已经实现了net.Conn接口了,用法也可以完全的相同

再比如说,请看如下方法:

func (c *UDPConn) ReadFromUDP(b []byte) (int, *UDPAddr, error) {
    if !c.ok() {
        return 0, nil, syscall.EINVAL
    }
    n, addr, err := c.readFrom(b)
    if err != nil {
        err = &OpError{Op: "read", Net: c.fd.net, Source: c.fd.laddr, Addr: c.fd.raddr, Err: err}
    }
    return n, addr, err
}

其中用到的c.fd其实是内部字段conn对象类的内部字段,因此也可以这样说:
ReadFromUDP是一个为程序员提高效率的方法,如果你的程序不需要实现UDP,TCP等的混合逻辑,可以不借助net.Conn
UDP与TCP最大的不同在于:

tcp的net.ListenTCP("tcp4", tcpAddr)拿到的是一个listener,而listener需要再去accept不同IP地址的client,才能拿到一个net.Conn
udp的net.ListenUDP("udp", udpAddr)拿到的直接是一个net.Conn

差异还是很大的,逻辑上似乎还是要改改:

https://blog.csdn.net/guidao13/article/details/84037778