[已解决]已设置 GOPATH,使用 os.Create () 新建一个 txt 文本,但生成的 txt 文件不在自己的指定路径下

各位大佬好,我是 Golang 新手。在学习新建文件的时候,遇到了一个路径的错误。

1.我的环境

  • os : win10 64bit
  • go version : go1.13.6 windows/amd64
  • IDE : GoLand 2019.3.1 x64


2.我的问题情况

我写了一段生成 txt 文件的代码,想要把这个 txt 放在当前目录下。
写完代码,直接点击了下图红框中的这个按钮来运行代码:
已设置GOPATH,使用os.Create()新建一个txt文本,但生成的txt文件不在自己的指定路径下
以下是我的全部代码:

package main

import (
    "fmt"
    "os"
)

func WriteFile(path string) {
    //1.打开文件(新建文件)
    f, err := os.Create(path)
    if err != nil {
        fmt.Println("create file failed. err:", err)
        return //有错误就结束函数,不让它往下走了
    }

    //使用完毕,必须关闭文件
    defer f.Close() //函数调用完毕,即表示文件使用完毕了

    //2.往里面写内容
    var s string
    for i := 0; i < 10; i++ {
        s = fmt.Sprintf("这是第%d行!\n", i)
        n, err := f.WriteString(s)
        if err != nil {
            fmt.Printf("write %d line err:%+v\n", i, err)
        } else {
            fmt.Printf("wrote %d words.\n", n) //以byte类型来计算长度
        }
    }
}

func main() {
    path := "./demo.txt" //放当前路径下
    WriteFile(path)
}

文本文件已生成成功,而且内容也是正确的。但是,文件的位置并不是我所想的结果。我所想的是:这个 txt 文件,它应该生成在 myTest 这个目录下,可是它却跑到了 src 目录下:
已设置GOPATH,使用os.Create()新建一个txt文本,但生成的txt文件不在自己的指定路径下


3.自我排查

第1步:检查go的环境变量
已设置GOPATH,使用os.Create()新建一个txt文本,但生成的txt文件不在自己的指定路径下
第2步:检查系统环境变量
已设置GOPATH,使用os.Create()新建一个txt文本,但生成的txt文件不在自己的指定路径下
第3步:检查IDE工具的配置
已设置GOPATH,使用os.Create()新建一个txt文本,但生成的txt文件不在自己的指定路径下
第4步:检查了源代码文件的所在位置
已设置GOPATH,使用os.Create()新建一个txt文本,但生成的txt文件不在自己的指定路径下
最终结果:还是老样子,使用这个 IDE 运行代码。这个 txt 文件,它就是往 src 目录下跑,就是不在 myTest 目录下。


4.在命令行敲指令运行

在命令行中敲运行指令,结果它就出现了!目录正确了!
已设置GOPATH,使用os.Create()新建一个txt文本,但生成的txt文件不在自己的指定路径下


最后:所以想请教下各位,是我这个 Goland 工具配置哪一项出了问题?还是使用这个工具的姿势不对呢?还是说这个 Goland 版本,它自身就在GOPATH上存在着问题?
用命令行指令能够出现在正确的目录下,用 Goland 中的运行指令却不行。命令行的指令肯定是去调了 GO SDK 中的 go.exe ,Goland 这个工具的运行指令其实也是调了环境变量中所指定的 go.exe 。既然两者都是调了同一个 go.exe ,为什么会出现不一样的结果。当然我知道是以命令行中的结果为准,就是想知道一下,是我使用工具的哪一步出了问题?
一个好的工具可以让学习、开发变得很有意思。我之前断断续续学了2年 Python,用的是 PyCharm,写代码确实很爽。所以这次入坑 Golang,也选择了 JetBrains 家族的 Goland,不想换工具了。所以想知道一下,我是哪一步出了问题?
谢谢各位大佬!

go
taadis
最佳答案

如果我没看错的话, go env 里明确指定了 GOPATH, 然后 GO111MODULE=auto, 你项目里也没有 go.mod 模块文件, 编译还正常, 应该是使用的传统的 GOPATH 方式, 默认的工作目录是 GOPATH 下的 src 目录, 而你用命令行直接在 myTest 目录下执行 go run .\main.go, 此时的工作目录是当前目录, 也就是 myTest 目录.

goland 的命令应该是这样的, 在 GOPATH/src 下执行 go run myTest/main.go 直接用命令行运行是这样的, 在 myTest 下执行 go run main.go

在加上你文件路径用的是相对路径 ./demo.txt 会根据执行文件所在的工作目录变动的.

你可以试试用 go build 命令编译成 exe 可执行文件, 然后直接执行 exe 文件, 看看 txt 文件会生成在哪个目录下?

顺便一提, 如果启用了 Go Module, 项目里没有 go.mod 模块文件, 编译是会报错的.

4年前 评论
root01 (楼主) 4年前
snowlyg 4年前
taadis (作者) 4年前
root01 (楼主) 4年前
讨论数量: 3

file 这个地方的配置方便贴出来吗?问题可能在这里

4年前 评论
taadis

如果我没看错的话, go env 里明确指定了 GOPATH, 然后 GO111MODULE=auto, 你项目里也没有 go.mod 模块文件, 编译还正常, 应该是使用的传统的 GOPATH 方式, 默认的工作目录是 GOPATH 下的 src 目录, 而你用命令行直接在 myTest 目录下执行 go run .\main.go, 此时的工作目录是当前目录, 也就是 myTest 目录.

goland 的命令应该是这样的, 在 GOPATH/src 下执行 go run myTest/main.go 直接用命令行运行是这样的, 在 myTest 下执行 go run main.go

在加上你文件路径用的是相对路径 ./demo.txt 会根据执行文件所在的工作目录变动的.

你可以试试用 go build 命令编译成 exe 可执行文件, 然后直接执行 exe 文件, 看看 txt 文件会生成在哪个目录下?

顺便一提, 如果启用了 Go Module, 项目里没有 go.mod 模块文件, 编译是会报错的.

4年前 评论
root01 (楼主) 4年前
snowlyg 4年前
taadis (作者) 4年前
root01 (楼主) 4年前

感谢 @taadis 和 @snowlyg 两位大佬的指点,确实是我在 Goland 设置中的工作目录这里配置错误。 直接用 Goland run 当前 myTest 目录下的 go 文件,估计 Goland 会去直接读取 GOPATH 的值。既然读取到了这个路径,那么文件也就理所当然地生成在这个 GOPATH 目录下了。下图是我原本的配置:

file 修改成如下: 把 src\myTest 路径添加到工作目录的路径后面,相当于设置了绝对路径。再运行,文件就是往这个绝对路径中写入了。 file

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!