我正在使用Go中的Cobra框架创建一个客户端,该框架包括将文件上传到传输服务,该服务很快就会发布. 我希望它是一个最低限度的自定义与一个默认的下载文件夹.

问题:当我想判断文件夹是否存在,该文件夹是文件夹而不是文件,或者判断我是否有权写入该文件夹时,我会收到一个巨大的Goroutine错误.

要了解以下内容: 我在MacOS中使用拖放

var dldpath string
inquire.Query().Input(&dldpath, "Chemin du dossier de téléchargement ", nil).Exec()

println("le chemin est : ", dldpath)

if len(dldpath) == 0 {
    fmt.Println(chalk.Red, "Erreur : Vous devez spécifier un dossier à téléverser")
    os.Exit(0)
}
dir, err := os.Stat(dldpath)

if !dir.IsDir() {
    fmt.Println(chalk.Red, "Erreur : Le chemin spécifié n'est pas un dossier")
    os.Exit(0)
}

if errors.Is(err, os.ErrNotExist) {
    fmt.Println(chalk.Red, "Erreur : Dossier introuvable")
    os.Exit(0)
}


screen.Clear()
screen.MoveTopLeft()
fmt.Println(chalk.Green, "Dossier de téléchargement par défaut changé avec succès")

错误:(对不起,我无法上传图片)

le chemin est :  '/Users/eliezayat/Downloads/bassine wavy.png'
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x119b260]

goroutine 1 [running]:
freetranscli/cmd.glob..func3(0x1370900?, {0x11ef012?, 0x0?, 0x0?})
        /Users/eliezayat/Documents/freetranscli/cmd/set.go:44 +0x280
github.com/spf13/cobra.(*Command).execute(0x1370900, {0x13a3d80, 0x0, 0x0})
        /Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:920 +0x847
github.com/spf13/cobra.(*Command).ExecuteC(0x1370620)
        /Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:1044 +0x3bd
github.com/spf13/cobra.(*Command).Execute(...)
        /Users/eliezayat/go/pkg/mod/github.com/spf13/cobra@v1.6.1/command.go:968
freetranscli/cmd.Execute()
        /Users/eliezayat/Documents/freetranscli/cmd/root.go:28 +0x25
main.main()
        /Users/eliezayat/Documents/freetranscli/main.go:8 +0x17
exit status 2

推荐答案

如果dir变量是nil,你将得到nil pointer dereference.

最好在判断目录(dir.IsDir())之前判断是否有任何错误(errors.Is):

dir, err := os.Stat(dldpath)
if errors.Is(err, os.ErrNotExist) {
    fmt.Println(chalk.Red, "Erreur : Dossier introuvable")
    os.Exit(0)
}
if !dir.IsDir() {
    fmt.Println(chalk.Red, "Erreur : Le chemin spécifié n'est pas un dossier")
    os.Exit(0)
}

Go相关问答推荐

gorm插入不支持的数据

为什么我不能使用Docker从本地访问我的Gin应用程序?

Golang Viper:如果第一个字段不存在,如何从另一个字段获取值

包裹网.Conn导致挂起读取

go-chi: 接受带有反斜杠的 url 路径参数

如何在 Go 中将 int 转换为包含 complex128 的泛型类型?

Go 中的 Azure JWT 验证不起作用

更改多对多连接表的名称

此 Golang 程序中的同步问题

使用 LINQ 对内部数组进行排序

设置指向空接口的指针

Golang Oauth2 服务帐户返回空刷新令牌字符串

函数实现接口时的模式名称是什么?

在 Gorm 的 AfterFind() 钩子中获取智能 Select struct 的值

Golang - 客户 Unmarshaler/Marshaler 在指针上具有 nil/null 值

将shell输出绑定到Go中的 struct 的最佳方法?

在 Go 中发送 ack 和 term 后消息仍在 nats 限制队列中

将未知长度切片的值分配给Go中的 struct ?

Unescape 在 rss 中两次逃脱了标题

如何使用 context.WithCancel 启动和停止每个会话的心跳?