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语句匹配网络接收字符串失败:如何解决不可见字符导致的匹配问题?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号