go 适配windows和linux获取文件创建时间的方法(跨平台的方法不一致的解决问题)
这个问题,按我理解也是非常普通的一个需求,但是今天查资料时,发现获取文件的创建时间,竟然要区分平台来实现代码,无法做到统一。
比如像这篇博文,https://blog.csdn.net/qq_37703224/article/details/140838032。有解释如何分别在windows和linux上获取文件创建时间的方法,但是却提供同时适配两种系统的办法。
我摸索了一个多小时,翻了golang的issue,发现有人提这个问题,但是似乎没找到解决方法,主要的困扰如下:
windows系统下, 是无法直接引入Stat_t
的。
我四处搜寻,也去找有没有开源的项目解决这个问题,大概翻了一下,也没看到有。
但是我还是不死心,然后就去翻一下源码,为什么windows下就不能提供统一的接口呢?
我通过Win32FileAttributeData
跳转过去,看看有啥特别的,接过无意间发现不是也有一个linux的types吗?
然后我点进去,搜一下关键词file
咦?这不是有吗?而且是大写字母开头的,为啥引用时却不行呢?
然后我就浏览一下整个文件。发现开头有行注释很特殊//go:build ignore
。感觉这个是有关系的。
于是搜索了一下。原来go的编译器在编译时,会处理这一类的关键词,而且文件名也是有特殊作用的。xxx_linux.go
,以_linux.go
结尾的文件,会认定为linux环境下才会编译的文件。windows环境下是无法引入和编译的。
所以找到了无法引用Stat_t
的原因了。于是,我就试一下,也起一个这样的名字的文件:
果然,在windows的开发环境下, 只要按照规则起名,也是可以引用linux下的代码:
// 不同操作系统下,会编译不同的文件
func GetFileCreateTime(sys any) *time.Time {
linuxFileAttr := sys.(*syscall.Stat_t)
createdTime := time.Unix(linuxFileAttr.Ctim.Sec, linuxFileAttr.Ctim.Nsec)
return &createdTime
}
总算,花了一个多小时,总算把这个问题解决了,只要对这一类问题,区分不同的文件,按照规则起名,就可以解决这一类问题。
又学会了一个知识点,golang是以这种方式解决跨平台的问题的。