Go语言switch case语句匹配网络接收字符串失败:如何解决不可见字符导致的匹配问题?

go语言switch case语句匹配网络接收字符串失败的原因及解决方法

在使用go语言进行网络编程时,经常会遇到需要根据接收到的字符串进行不同操作的情况。本文将针对一个go语言程序中switch case语句无法匹配到通过网络接收到的字符串的问题进行分析和解决。

问题描述:程序使用net.conn.read方法接收客户端消息,然后使用strings.split和strings.trim处理接收到的字符串,最后使用switch case语句根据字符串内容执行不同操作。尽管打印出的action变量值与switch case中的case值相同(均为”tunnelok”),但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], " ")    //action := "tunnelok"    fmt.printf("%s%t",action, action) //此处输出结果:tunnelokstring    switch action {    case "tunnelok":        fmt.println("隧道打成功了")        ......    }}

问题原因分析:

立即学习“go语言免费学习笔记(深入)”;

问题在于read := make([]byte, 2048)这一行代码。该语句创建了一个长度为2048字节的byte切片read,其初始值全部为0。随后,append(read, readtmp[:num]…)将接收到的数据追加到read切片中。 string(read)将read切片转换为字符串时,包含了之前的2048个0字节,这些0字节对应的ascii码为不可见字符。strings.trim函数只去除字符串开头和结尾的空格,而无法去除这些不可见字符。因此,action变量中包含了不可见字符,导致switch case语句无法匹配。

解决方案:

为了解决这个问题,可以使用strings.trimspace函数代替strings.trim函数。trimspace函数会去除字符串开头和结尾的所有空白字符,包括不可见字符。修改后的代码如下:

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

更彻底的解决方案是避免在read切片中预先分配大量的空间。可以将read的声明修改为:

var read []byte

或者

read := []byte{}

这样可以避免在read切片中包含额外的0字节,从而避免了switch case匹配失败的问题。 readtmp是否也需要类似修改,可以根据实际情况进行测试。

以上就是Go语言switch case语句匹配网络接收字符串失败:如何解决不可见字符导致的匹配问题?的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 05:35:11
下一篇 2025年12月15日 05:35:20

相关推荐

发表回复

登录后才能评论
关注微信