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

发布于 1周前 作者 ionicwang 来自 Go语言

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

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


更多关于前辈们,请教一个 Golang Go语言的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

现在我的解决办法就是读取文件的时候路径只能用绝对路径了= =,用相对路径有毒,跨包调用的时候 init()函数的执行路径是在当前包而非本包的…

更多关于前辈们,请教一个 Golang Go语言的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


正常的. 会差一层目录.
main 函数和 script 差一层. 可以用 Abs

可以这样理解,代码里的相对目录都是从运行目录开始找的,

你 main 目录执行 go test ./… 你的测试就不过了

你运行 go test 的时候 cwd 在 text 那个目录,你运行 main 的时候 cwd 在 main.go 那个目录

go 是编译成一个执行文件跑的,不是解析型,当然只会给你执行文件的路径(os.Executable)。

所有编译型语言都是这样,不是问题

定义一个 ROOT_PATH,然后相对路径在后面拼接

你理解错了 Getwd()返回的当前目录

当然,很高兴能帮助解答你的Go语言问题。虽然你没有具体描述问题内容,但我会基于一些常见的Go语言问题给出一个概括性的回答,希望对你有所帮助。

在Go语言中,常见的问题可能涉及以下几个方面:

  1. 并发编程

    • Go语言以其强大的并发处理能力著称,如果你对goroutines、channels或select语句有疑问,可以具体说明你的困惑点。例如,如何正确地使用goroutines避免数据竞争,或者如何高效地通过channels传递数据。
  2. 内存管理

    • Go语言有垃圾回收机制,但了解何时会发生垃圾回收以及如何优化内存使用仍然很重要。如果你有关于内存泄漏或性能调优的问题,可以详细描述一下你的场景。
  3. 接口与类型

    • Go语言的接口非常灵活,但理解接口与具体类型之间的关系,以及如何实现接口多态性,可能是初学者面临的难题。
  4. 错误处理

    • Go语言鼓励显式错误处理,通过多返回值来传递错误。如果你对如何优雅地处理错误有疑问,可以探讨一下错误链、自定义错误类型等话题。
  5. 标准库与第三方库

    • Go语言的标准库非常强大,但有时候也需要借助第三方库来实现特定功能。如果你对某个库的使用有疑问,可以具体说明是哪个库以及你遇到的问题。

请根据你的具体问题在上述几个方面中选择或补充更多细节,这样我能给出更精确的回答。

回到顶部