第一次折腾 golang

2017-06-11 17:53:17 +08:00
 xrlin

今天开始用 go 写自己的个人项目,按照一般的项目结构,在 config 目录下添加 database.json 配置文件,然后通过 os.Open('database.json')读取,然而在外部调用运行后总是读取不到文件,debug 了好久才发觉 golang 是根据 main.go 文件的目录为运行目录的,只能通过

_, file, _, _ := runtime.Caller(0)

获取正确的路径( java 貌似直接使用相对路径也是有问题的),最后通过 filepath.Join 方法将两个路径合并,然而在 windows 下执行

filepath.Join(file, 'database.json')

后依旧报错(ˉ▽ˉ;)...

将路径打印出来后才发现路径变成了

...省略.../WebProject/server/configdatabase.json

filepath.Join 方法在 windows 下使用有 bug,google 搜索了下发现这 bug 很早之前就有人提出来了,但一直没修复。。。

还有 interface 和 nil 的相等性这个也是很容易掉进去的坑。。。

很喜欢 go 简单的语法、静态类型、单文件部署,很久没用过静态类型的语言,又不想用 java,打算学习下 go,却掉坑里了。。。也许是太久没接触这类语言了( ̄▽ ̄)"

4803 次点击
所在节点    程序员
13 条回复
Immortal
2017-06-11 18:26:25 +08:00
filepath.Abs("databases.json")不就是绝对路径么
Kisesy
2017-06-11 18:37:26 +08:00
应该用 os.Executable(),获取 exe 的地址,然后拼路径
xrlin
2017-06-11 18:44:46 +08:00
@Immortal 你可以试一下,在 package A 中的一个文件中使用 filepath.Abs 方法尝试获取绝对路径,然后在 package B 中调用 package A,这时 filepath.Abs 是以 package B 作为父目录的。
reus
2017-06-11 19:07:32 +08:00
s.Executable()
xrlin
2017-06-11 19:44:46 +08:00
@Kisesy 考虑到可以单文件部署,os.Executable()确实更好,但开发的时候如果需要运行某些单元测试文件,而这些文件在另一文件夹中,通过 os.Executable()获取到的就是这个单元测试文件所在的路径,这样拼接起来的路径也是错误的,而且在开发时 ide 默认都是将编译后的文件放到一个临时目录的,这样会导致执行出错。
whatot
2017-06-11 19:48:51 +08:00
用绝对路径解决问题或者传参数,避免相对路径
reus
2017-06-11 20:29:31 +08:00
@xrlin 测试时,在 TestMain 函数里,复制所需的文件到 os.Executable 返回的目录,再开始测试
wweir
2017-06-11 20:34:41 +08:00
已经不知道在讲什么了。
main.go 目录?确定不是运行目录?
freestyle
2017-06-11 20:55:41 +08:00
工作目录目录默认难道不是敲命令的那个目录吗 为什么不 filepath.Join(file, 'config/database.json')呢
xrlin
2017-06-11 21:09:43 +08:00
@freestyle 我是直接用 gogland 的,这样比较方便执行某个文件和相关测试,比如我有一个 test 目录,下面存放一些测试的 go 文件,用 gogland 直接执行这些文件,这时的工作目录就变成了 test 目录了。
pwcong
2017-06-11 21:56:40 +08:00
bytes, err := ioutil.ReadFile(filepath.Join(filepath.Dir(os.Args[0]), "config", "database.json"))
Miy4mori
2017-06-12 08:47:09 +08:00
java 直接使用相对路径也有问题还行,怕不是不知道 classpath ?
xrlin
2017-06-12 09:30:15 +08:00
@Miy4mori 哈哈,你不提 classpath 我还真想不起来了,以前写 java 遇到路径问题就是用 classpath 处理的。

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

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

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

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

© 2021 V2EX