这是一个关于我们可能在未来改变的net/v2(~ "Go 2")包的元数据/索引错误,包括指向其他问题的链接,或者是关于API问题/清理工作的评论,这些评论太少,不足以成为它们自己的bug。(这与net/http、net/mail、net/rpc、net/smtp、net/nextproto或net/url无关。如果需要的话,那些应该有自己的bug。)
net/v2
net/http
net/mail
net/rpc
net/smtp
net/nextproto
net/url
m3eecexj1#
从UDP连接中读取数据可能有至少1种过多的方法:
go1.txt:pkg net, method (*UDPConn) Read([]uint8) (int, error) go1.txt:pkg net, method (*UDPConn) ReadFrom([]uint8) (int, Addr, error) go1.txt:pkg net, method (*UDPConn) ReadFromUDP([]uint8) (int, *UDPAddr, error) go1.1.txt:pkg net, method (*UDPConn) ReadMsgUDP([]uint8, []uint8) (int, int, int, *UDPAddr, error)
同样,对于UnixConn和IPConn也是如此。也许它们仍然不够充分,因为在以下链接中提到:https://golang.org/pkg/net/#UDPConn.ReadMsgUDP可以使用golang.org/x/net/ipv4和golang.org/x/net/ipv6包来操作oob中的IP层套接字选项。也许我们可以将其放在一个地方,并删除一些冗余的选项。
polkgigr2#
5gfr0r5j3#
另外,更一般的
0dxa2lsx4#
这个现在已经标记为1.13版本,但自2012年以来一直开放。
htzpubme5#
以下是我脑海中的一些想法,尽管这些都必须是单独的提案,我仍然没有具体的草稿提案:
zed5wv106#
翻译结果:建议在监听器接口中添加 SetDeadline 方法。
ozxc1zmp7#
f8rj6qna8#
在我的网络包贡献后的几点思考:
net/netip
LookupAddr
[]string
[]netip.Addr
func LookupCNAME(string) ([]string, error) {/*...*/} // Struct, insted of returning multiple values in LookupHostInfo, so that we can add more field in the future. type HostInfo struct { Addrs []netip.Addr CanonicalName string } func LookupHostInfo(string) (HostInfo, error) {/*...*/} func LookupCanonicalName(h string) (string, error) { hi, err := LookupHostInfo(h) if err != nil { return "", err } return hi.CanonicalName, nil }
type Network uint8 const ( NetworkUDP Network = iota NetworkUDP4 NetworkUDP6 NetworkTCP NetworkTCP4 NetworkTCP6 // .... )
LookupHost
LookupIP
LookupIPAddr
LookupNetIP
func LookupIP(network Network, host string) ([]netip.Addr, error) { hi, err := LookupHostInfo(h) if err != nil { return nil, err } return hi.Addrs, nil }
DNSError
Err
IsTimeout
IsTemporary
IsNotFound
unwrapErr
type DNSError struct { name string server netip.Addr unwrapErr error }
保持仅返回少数错误条件的 Unwrap 行为,这种逻辑已移动到 Unwrap 方法中:go/src/net/net.go第 686 行至第 690 行的 3959d54| | // 此时,我们 Package 的唯一错误是上下文错误,以允许用户检查已取消/超时的请求。 || | iferrors.Is(err, context.DeadlineExceeded) | | errors.Is(err, context.Canceled) { || | unwrapErr=err | | } |而不是 IsNotFound 字段,定义一个全局错误并通过 (*DNSError).Unwrap 方法返回它。然后将其用作 errors.Is(err, net.ErrHostNotFound)。
Unwrap
(*DNSError).Unwrap
errors.Is(err, net.ErrHostNotFound)
ErrHostNotFound = errors.New("no such host")
DNSConfigError
DefaultResolver
atomic.Pointer
8条答案
按热度按时间m3eecexj1#
从UDP连接中读取数据可能有至少1种过多的方法:
同样,对于UnixConn和IPConn也是如此。
也许它们仍然不够充分,因为在以下链接中提到:
https://golang.org/pkg/net/#UDPConn.ReadMsgUDP
可以使用golang.org/x/net/ipv4和golang.org/x/net/ipv6包来操作oob中的IP层套接字选项。
也许我们可以将其放在一个地方,并删除一些冗余的选项。
polkgigr2#
5gfr0r5j3#
另外,更一般的
0dxa2lsx4#
这个现在已经标记为1.13版本,但自2012年以来一直开放。
htzpubme5#
以下是我脑海中的一些想法,尽管这些都必须是单独的提案,我仍然没有具体的草稿提案:
zed5wv106#
翻译结果:建议在监听器接口中添加 SetDeadline 方法。
ozxc1zmp7#
f8rj6qna8#
在我的网络包贡献后的几点思考:
net/netip
是默认的且唯一的 IP 地址。LookupAddr
返回一个[]string
,应该是[]netip.Addr
。LookupHost
、LookupIP
、LookupIPAddr
、LookupNetIP
),应该只有一个:DNSError
中删除Err
、IsTimeout
、IsTemporary
、IsNotFound
字段,保留从unwrapErr
检索它们的方法。使所有字段不可导出,名称和服务器对于构建漂亮的错误消息很有用,但不确定它们在实际代码中有多大用处(我们甚至可以让DNSError
不可导出)。保持仅返回少数错误条件的
Unwrap
行为,这种逻辑已移动到Unwrap
方法中:go/src/net/net.go
第 686 行至第 690 行的 3959d54
| | // 此时,我们 Package 的唯一错误是上下文错误,以允许用户检查已取消/超时的请求。 |
| | iferrors.Is(err, context.DeadlineExceeded) | | errors.Is(err, context.Canceled) { |
| | unwrapErr=err | | } |
而不是
IsNotFound
字段,定义一个全局错误并通过(*DNSError).Unwrap
方法返回它。然后将其用作errors.Is(err, net.ErrHostNotFound)
。DNSConfigError
。DefaultResolver
应该是一个带有全局getter和setter的不可导出的atomic.Pointer
。