Go程序如何循环提示用户输入有效目录并解决空指针panic问题
问题根因
你的panic是空指针异常导致的,触发点在x.IsDir()这行:
你用
x, _ := os.Stat(text)直接忽略了错误返回值,当用户输入的路径不存在、无权限访问时,os.Stat返回的第一个值x会是nil,此时调用nil结构体的IsDir()方法就会触发空指针panic。
此外你的原有逻辑就算拿到有效目录也不会退出循环,会持续等待用户输入,不符合需求。
修复要点
- 必须判断
os.Stat的返回错误,排除路径不存在、无权限等异常场景 - 输入有效目录后主动跳出循环,不需要继续等待输入
- 每次输入无效后重新提示用户输入,符合交互逻辑
- 增加
bufio.Scanner自身的错误判断,处理终端输入异常的情况
可运行完整代码
package main import ( "bufio" "fmt" "os" ) func main() { var targetDir string scanner := bufio.NewScanner(os.Stdin) fmt.Println("What file path would you like to search?") for scanner.Scan() { inputPath := scanner.Text() fileInfo, err := os.Stat(inputPath) if err != nil { fmt.Printf("路径无效: %v,请重新输入:\n", err) continue } if !fileInfo.IsDir() { fmt.Println("输入的路径不是目录,请重新输入:") continue } // 走到此处说明拿到有效目录 targetDir = inputPath fmt.Println("Cool this is a directory") break } // 处理scanner本身的输入错误 if err := scanner.Err(); err != nil { fmt.Printf("读取输入失败: %v\n", err) return } // 后续可直接使用targetDir执行对应操作 fmt.Printf("即将处理目录: %s\n", targetDir) }
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

