将 net.Dialer 的超时设置和连接的截止日期设置为相同的行为吗?

Does setting the timeout on the net.Dialer and deadline on the Connection result to the same behaviour?

在 Go 中,我从拨号器创建连接(超时):

d := net.Dialer{Timeout: timeout, LocalAddr: *localAddr}
c.conn, err = d.Dial("tcp", address)

不过,那我也可以设置连接的截止日期:

 c.conn.SetDeadline(time.Now().Add(timeout));

这是多余的,还是这里设置超时和截止时间有功能上的差异?

这些完全不同。

net.Dialer用于建立连接。 最后期限(或超时)适用于连接建立。分别引用 TimeoutDeadline 字段的文档:

Timeout is the maximum amount of time a dial will wait for a connect to complete.

Deadline is the absolute point in time after which dials will fail.

另一方面,net.Conn 持有已建立的连接。 超时适用于连接 上的read/write 操作。 net.Conn:

的文档中也明确说明了这一点

SetDeadline sets the read and write deadlines associated with the connection. It is equivalent to calling both SetReadDeadline and SetWriteDeadline.

请注意,这是一组常见的超时(以及其他超时):一个用于建立连接,另一个用于对已建立的连接进行操作。