V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
w2bgopher
V2EX  ›  Go 编程语言

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

  •  
  •   w2bgopher · 2019-12-28 21:51:36 +08:00 · 3810 次点击
    这是一个创建于 1793 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    所有编译型语言都是这样,不是问题
    whoami9894
        6
    whoami9894  
       2019-12-29 13:52:20 +08:00
    定义一个 ROOT_PATH,然后相对路径在后面拼接
    wqtacc
        7
    wqtacc  
       2019-12-29 19:38:48 +08:00
    你理解错了 Getwd()返回的当前目录
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   886 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:44 · PVG 05:44 · LAX 13:44 · JFK 16:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.