Go语言循环内fmt.Printf不执行问题排查与解决
Go语言服务器状态检查函数无输出的排查与解决
最近我在用Go写一个小工具,功能是通过主机名检查服务器列表里指定机器的运行状态,结果碰到了个头疼的问题:函数里的输出语句死活不打印内容,哪怕注释里的测试日志明明能输出预期结果。
问题详情
我写了getServerStatus函数,流程是先调用getAllServers()获取所有服务器的信息,存在server类型的切片里,然后遍历切片判断目标服务器的状态。
一开始我加了两行测试日志(后来注释掉了):
// fmt.Printf("Server: %s - Status: %s\n", server.Name, status) // fmt.Printf("%t\n", name == strings.ToLower(server.Name))
取消注释后,这两行能正常输出服务器名称、状态,以及匹配判断的布尔值,看起来逻辑是对的,但循环里if判断块内的fmt.Printf()就是没输出。后来我尝试把这个函数改成goroutine运行,用string通道传递结果,执行go run main.go后还是啥都没有。
我的函数代码如下:
func getServerStatus(name string) { servers := getAllServers() for _, server := range servers { status := boolToStatusString(server.Status) // fmt.Printf("Server: %s - Status: %s\n", server.Name, status) // fmt.Printf("%t\n", name == strings.ToLower(server.Name)) if server.Name == strings.ToLower(name) { fmt.Printf("%s is %s", name, status) } } }
问题根源
盯着代码看了半天,终于发现问题出在if的判断条件上:server.Name == strings.ToLower(name)。这里我只把传入的name转成了小写,但服务器列表里的server.Name可能是大写或者混合大小写的,导致两者根本匹配不上,if语句块里的代码自然就没机会执行,也就没有输出了。
解决方法
把判断条件里的两端字符串都统一转成小写(或者统一转成大写),实现大小写不敏感的匹配:
func getServerStatus(name string) { servers := getAllServers() for _, server := range servers { status := boolToStatusString(server.Status) if strings.ToLower(server.Name) == strings.ToLower(name) { fmt.Printf("%s is %s\n", name, status) // 顺便加个换行让输出更美观 } } }
修改之后,就能正确匹配到目标服务器,输出预期的状态信息了。
内容的提问来源于stack exchange,提问作者hedrick
相关产品推荐
相关产品推荐

