- 开发无止境 -
Data: 2017-12-19 21:18:54Form: JournalClick: 13
今天我们来看一个很小,很实用的库go-homedir。顾名思义,go-homedir
用来获取用户的主目录。 实际上,使用标准库os/user
我们也可以得到这个信息:
那么为什么还要go-homedir
库?
在 Darwin 系统上,标准库os/user
的使用需要 cgo。所以,任何使用os/user
的代码都不能交叉编译。 但是,大多数人使用os/user
的目的仅仅只是想获取主目录。因此,go-homedir
库出现了。
go-homedir
是第三方包,使用前需要先安装:
使用非常简单:
go-homedir
有两个功能:
Dir
:获取用户主目录;Expand
:将路径中的第一个~
扩展成用户主目录。由于Dir
的调用可能涉及一些系统调用和外部执行命令,多次调用费性能。所以go-homedir
提供了缓存的功能。默认情况下,缓存是开启的。 我们也可以将DisableCache
设置为false
来关闭它。
使用缓存时,如果程序运行中修改了主目录,再次调用Dir
还是返回之前的目录。如果需要获取最新的主目录,可以先调用Reset
清除缓存。
go-homedir
源码只有一个文件homedir.go,今天我们大概看一下Dir
的实现,去掉缓存相关代码:
判断当前的系统是windows
还是类 Unix,分别调用不同的方法。先看 windows 的,比较简单:
流程如下:
HOME
,如果不为空,返回这个值;USERPROFILE
,如果不为空,返回这个值;HOMEDRIVE
和HOMEPATH
,如果两者都不为空,拼接这两个值返回。类 Unix 系统的实现稍微复杂一点:
流程如下:
HOME
(注意 plan9 系统上为home
),如果不为空,返回这个值;getnet
命令查看系统的数据库中的相关记录,我们知道passwd
文件中存储了用户信息,包括用户的主目录。使用getent
命令查看passwd
中当前用户的那条记录,然后从中找到主目录部分返回;cd
后不加参数是直接切换到用户主目录的,而pwd
可以显示当前目录。那么就可以结合这两个命令返回主目录。这里分析源码并不是表示使用任何库都要熟悉它的源码,毕竟使用库就是为了方便开发。 但是源码是我们学习和提高的一个非常重要的途径。我们在使用库遇到问题的时候也要有能力从文档或甚至源码中查找原因。