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是以这种方式解决跨平台的问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsjweiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值