使用的是 go mod 跨包调用文件指针出现文件路径问题
文件 Tree: Gomod ReadFile script.go script_test.go test.txt main.go
script.go
var File *os.File func init(){ Read() } func Read(){ p,_:=os.Getwd() fmt.Println("当前路径是:",p) file,err:=os.Open("test.txt") if err!=nil{ log.Fatal(err) } File = file }
script_test.go
file := File b,err:=ioutil.ReadAll(file) if err!=nil{ panic(err) } defer file.Close() fmt.Println(string(b))
结果为:
当前路径是: D:\项目文件\GoModLearn\GO 语言编程\调试程序\ReadFile === RUN TestRead helloworld --- PASS: TestRead (0.00s) PASS
main.go
func main() { file:=ReadFile.File b,err:=ioutil.ReadAll(file) if err!=nil{ panic(err) } defer file.Close() fmt.Println(string(b)) }
结果为:
当前路径是: D:\项目文件\GoModLearn 2019/12/28 21:48:37 open test.txt: The system cannot find the file specified.
不同的地方调用该文件指针,init()打印的当前路径不一样,求前辈们指导一下~~~
![]() | 1 w2bgopher OP 现在我的解决办法就是读取文件的时候路径只能用绝对路径了= =,用相对路径有毒,跨包调用的时候 init()函数的执行路径是在当前包而非本包的.... |
2 watsy0007 2019-12-29 01:21:59 +08:00 正常的. 会差一层目录. main 函数和 script 差一层. 可以用 Abs |
![]() | 3 cnbattle 2019-12-29 08:15:52 +08:00 via Android 可以这样理解,代码里的相对目录都是从运行目录开始找的, 你 main 目录执行 go test ./.... 你的测试就不过了 |
4 GjriFeu 2019-12-29 09:00:51 +08:00 via iPhone 你运行 go test 的时候 cwd 在 text 那个目录,你运行 main 的时候 cwd 在 main.go 那个目录 |
![]() | 5 reus 2019-12-29 09:48:05 +08:00 go 是编译成一个执行文件跑的,不是解析型,当然只会给你执行文件的路径(os.Executable)。 所有编译型语言都是这样,不是问题 |
![]() | 6 whoami9894 2019-12-29 13:52:20 +08:00 定义一个 ROOT_PATH,然后相对路径在后面拼接 |
![]() | 7 wqtacc 2019-12-29 19:38:48 +08:00 你理解错了 Getwd()返回的当前目录 |