前辈们,请教一个 Go 语言的问题

2019-12-28 21:51:36 +08:00
 w2bgopher

使用的是 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()打印的当前路径不一样,求前辈们指导一下~~~

3659 次点击
所在节点    Go 编程语言
7 条回复
w2bgopher
2019-12-28 22:12:53 +08:00
现在我的解决办法就是读取文件的时候路径只能用绝对路径了= =,用相对路径有毒,跨包调用的时候 init()函数的执行路径是在当前包而非本包的....
watsy0007
2019-12-29 01:21:59 +08:00
正常的. 会差一层目录.
main 函数和 script 差一层. 可以用 Abs
cnbattle
2019-12-29 08:15:52 +08:00
可以这样理解,代码里的相对目录都是从运行目录开始找的,

你 main 目录执行 go test ./.... 你的测试就不过了
GjriFeu
2019-12-29 09:00:51 +08:00
你运行 go test 的时候 cwd 在 text 那个目录,你运行 main 的时候 cwd 在 main.go 那个目录
reus
2019-12-29 09:48:05 +08:00
go 是编译成一个执行文件跑的,不是解析型,当然只会给你执行文件的路径(os.Executable)。

所有编译型语言都是这样,不是问题
whoami9894
2019-12-29 13:52:20 +08:00
定义一个 ROOT_PATH,然后相对路径在后面拼接
wqtacc
2019-12-29 19:38:48 +08:00
你理解错了 Getwd()返回的当前目录

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/633202

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX