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
微信扫一扫
支付宝扫一扫