Go switch case 匹配网络接收字符串失败:为什么明明是 "TUNNELOK" 却无法匹配?

go switch case 匹配网络接收字符串失败:为什么明明是

go switch case 匹配网络接收字符串失败

在处理客户端网络消息的代码中,作者遇到了一个问题:switch case 无法匹配从网络接收到的字符串。

问题分析

代码如下:

func dealwithclientmsg(conn net.conn) {    read := make([]byte, 2048)    readtmp := make([]byte, 1024)    num, err := conn.read(readtmp)    if err != nil {        log.println("接受客户端消息失败:", err.error())    }    read = append(read, readtmp[:num]...)    log.println("接收到客户端消息:", string(read))    contentlist := strings.split(string(read), ":")    action := strings.trim(contentlist[0], " ")    switch action {    case "tunnelok":        fmt.println("隧道打成功了")        ......    }}

登录后复制

从代码中可以看出,action 变量的值是字符串,而 switch case 的 case 子句也是字符串。但是,即使 action 的值明明就是 “tunnelok”,却无法匹配到 switch case。

原因推测

经过分析,推测造成这个问题的原因可能是:

append 操作后,read 数组前 2048 个元素为零值,在转换成字符串后产生了不可见字符。strings.trim 无法清除所有不可见字符,导致 switch case 无法匹配。

解决方案

根据推测,可以采取以下解决方案:

修改 trim 函数为 strings.trimspace,它可以清除所有不可见字符。修改 make 初始化方式,避免将 2048 个零值添加到 read 数组中。

代码修改如下:

action := strings.trimspace(contentlist[0])

登录后复制

read := []byte{} // 或 var read []byte

登录后复制

只要 action 变量的值确实是 “tunnelok”,那么 switch case 就能够正常匹配。

以上就是Go switch case 匹配网络接收字符串失败:为什么明明是 “TUNNELOK” 却无法匹配?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2315768.html

(0)
上一篇 2025年2月28日 14:36:41
下一篇 2025年2月19日 23:35:25

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论