Go语言中如何用errors.Is检测UDPConn.Read返回的WSAEMSGSIZE错误?
检测Go中Windows平台UDP读取的WSAEMSGSIZE错误
在Windows平台下,你遇到的UDP读取错误对应Winsock的WSAEMSGSIZE错误(错误码10040),要检测该错误不能直接用errors.Is,需要通过errors.As提取底层系统错误类型后判断,具体实现如下:
核心检测函数
//go:build windows // +build windows import ( "errors" "syscall" ) func IsWSAEMsgSizeError(err error) bool { var sysErr syscall.Errno // 遍历错误链,提取底层的系统错误值 if errors.As(err, &sysErr) { return sysErr == syscall.WSAEMSGSIZE } return false }
业务代码中使用示例
conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: 7089}) if err != nil { // 处理监听初始化错误 } buf := make([]byte, 1024) _, _, err = conn.ReadFromUDP(buf) if err != nil { if IsWSAEMsgSizeError(err) { // 处理数据包过大场景,例如扩容缓冲区后重新读取 largerBuf := make([]byte, 4096) conn.ReadFromUDP(largerBuf) } else { // 处理其他网络类错误 } }
关键注意点
- 不要通过错误文本判断:错误提示内容可能随Go版本、系统语言环境变化,而
syscall.WSAEMSGSIZE是固定的系统错误码,可靠性更高。 - 条件编译:通过
//go:build windows限定代码仅在Windows平台编译,避免跨平台时出现兼容性问题。
内容的提问来源于stack exchange,提问作者Hoodoo
相关产品推荐
相关产品推荐

