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

golang 包的 init 函数问题

  •  
  •   TenTo 2016-07-08 21:05:36 +08:00 1549 次点击
    这是一个创建于 3386 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天在写代码的时候,发现一个有点违反直觉的地方,如下的文件夹结构:

    ├── XXX │ ├── xxx.go │ └── 123.txt │ └── main.go 

    XXX 包的 xxx.go 中 init 函数会去打开 123.txt:

    os.Open("123.txt") //这个会失败 
    os.Open("XXX/123.txt") //这个才能成功打开文件 

    有谁知道为什么前一个打开会失败吗?

    谢谢。

    10 条回复    2016-07-10 09:58:20 +08:00
    kofj
        1
    kofj  
       2016-07-08 21:16:37 +08:00
    init 里面打印依稀 os.Getwd() 你就知道为什么了。
    TenTo
        2
    TenTo  
    OP
       2016-07-08 21:22:25 +08:00
    @kofj ,os.Getwd()打印出来的路径是相对 main.go 的位置来说的。那现在的问题就是,如果 123.txt 文件是只有 XXX 包使用,这就很有问题,不可能每次在使用的时候都修改 xxx.go 的代码吧。
    有什么方法可以解决这个问题?
    raincious
        3
    raincious  
       2016-07-08 21:28:50 +08:00
    其实这不违反直觉啊。

    因为编译好的文件和你的代码是两个不同的东西,源文件的相对位置和可执行文件的相对位置自然是不一样的。
    TenTo
        4
    TenTo  
    OP
       2016-07-08 21:32:12 +08:00
    @raincious ,那 123.txt 只有 XXX 包会用,在 xxx.go 文件里面的应该怎么写路径?是不是我只能将 123.txt 的内容也编译进代码里面?
    zhujinliang
        5
    zhujinliang  
       2016-07-08 21:32:15 +08:00 via iPhone
    不管 a 包 b 包 c 包,编译后就是一个文件,调试信息一去,没人知道原来谁是谁
    如果 123.txt 文件只在包 xxx 中使用,要么告诉用户请复制文件 123.txt 到某处,要么把文件内容写进 go 代码
    没办法,程序就是程序,数据就是数据, golang 还不支持资源
    TenTo
        6
    TenTo  
    OP
       2016-07-08 21:35:40 +08:00
    @zhujinliang ,理解了,谢谢。
    raincious
        7
    raincious  
       2016-07-08 21:36:39 +08:00
    @TenTo

    如果你不理解路径的问题,可以用 go build 产生一个可执行文件,然后以那个文件的位置作为基准来确定相对路径。

    文件不大的话你到是可以考虑把整个文件保存成常量。但是如果文件体积比较大编译会很慢。
    wweir
        8
    wweir  
       2016-07-09 08:30:11 +08:00 via Android
    如果 123 是静态的,干嘛不直接打在源码里。如果是动态的,基本就是项目相关,放在项目的特定目录不好么。
    还有第三种常见使用场景的话,请告知
    CRVV
        9
    CRVV  
       2016-07-09 22:00:59 +08:00 via Android
    看起来应该用 go-bindata
    cosiner
        10
    cosiner  
       2016-07-10 09:58:20 +08:00
    不论什么语言, 运行的时候初始目录都是当前目录, 和代码结构没关系, 相对路径也是相对于当前目录来.

    初始目录可以使用类似 Chdir 的 api 改变
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3071 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:16 PVG 20:16 LAX 05:16 JFK 08:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86