当前位置: 首页 > news >正文

Golang条件编译 | 获取系统的磁盘空间内存占用demo | gopsutil/disk库(跨平台方案)

文章目录

    • 一、Golang条件编译
      • 1. 构建标签( Build tags)
      • 2. 文件后缀(File suffixes)
    • 二、GO golang 获取磁盘空间 条件编译
      • 思路
    • 三、【推荐】使用github.com/shirou/gopsutil/disk这个库,如何获取机器下不同磁盘分区的内容

一、Golang条件编译

在实际的项目开发中,我们可能需要根据运行环境的不同来编译不同的文件.

Golang 支持两种条件编译方式:

  • 构建标签( Build tags)
  • 文件后缀(File suffixes)

两者可以结合起来使用。

1. 构建标签( Build tags)

Go使用 go/build包 中定义的标签系统(system of tags)和命名约定(naming convention)以及go tool中的相应支持来允许Go包编译特定代码。

说简单的,就是通过约定好的规定,在执行go build 选择性地包含或排除代码的机制。

注意,go1.17 过后,条件编译的写法和之前有些不同,需要注意一下。

当Go编译一个包时,它会分析包内的每个源码文件并查找构建标签。标签决定了这个源码文件是否被编译。条件编译的最小单元是以 文件 来进行的。

构建约束以一行+build开始的注释。在+build之后列出了一些条件,在这些条件成立时,该文件应包含在编译的包中;
约束可以出现在任何源文件中,不限于go文件;
+build必须出现在package语句之前,+build注释之后应要有一个空行,否则不会生效。

2. 文件后缀(File suffixes)

这种方案比构造标签方案更简单。

如果文件名包含_KaTeX parse error: Expected group after '_' at position 49: …台会忽略这个文件。另一种约定是_̲GOARCH.go。这两种后缀可以组合起来,但要保证顺序,正确的格式是_KaTeX parse error: Expected group after '_' at position 5: GOOS_̲GOARCH.go,错误的格式是_KaTeX parse error: Expected group after '_' at position 7: GOARCH_̲GOOS.go。

如果使用的是 goland 当在 windows 上面新建文件名为 xxxx_linux.go时,goland 会自动提示 tag_linux.go is ignored by the build tool because of the OS mismatch。

二、GO golang 获取磁盘空间 条件编译

GO golang 获取磁盘空间 条件编译
参考URL: https://www.jianshu.com/p/f3d31f84d95d

思路

思路: 根据不同的操作系统创建不同的文件,并使用条件编译指令来选择相应的文件进行编译

首先,创建 disc_space_linux.go 文件,用于 Linux 系统的实现
获取磁盘占用情况(Linux/Mac下有效)

import ("syscall"
)type DiskStatus struct {All  uint64 `json:"all"`Used uint64 `json:"used"`Free uint64 `json:"free"`
}// disk usage of path/disk
func DiskUsage(path string) (disk DiskStatus) {fs := syscall.Statfs_t{}err := syscall.Statfs(path, &fs)if err != nil {return}disk.All = fs.Blocks * uint64(fs.Bsize)disk.Free = fs.Bfree * uint64(fs.Bsize)disk.Used = disk.All - disk.Freereturn
}

然后,创建 disc_space_windows.go 文件,用于 Windows 系统的实现
windows好像不用判断某个目录占用和剩余空间大小,直接判断这个目录所在的盘符占用空间多少,剩余空间多少就行。

package utilsimport "unsafe"
import ("golang.org/x/sys/windows"
)type DiskStatus struct {All  uint64Used uint64Free uint64
}func DiskUsage(path string) (disk DiskStatus) {h := windows.MustLoadDLL("kernel32.dll")c := h.MustFindProc("GetDiskFreeSpaceExW")lpFreeBytesAvailable := uint64(0)lpTotalNumberOfBytes := uint64(0)lpTotalNumberOfFreeBytes := uint64(0)r1, r2, err := c.Call(uintptr(unsafe.Pointer(windows.StringToUTF16Ptr("C:"))),uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)))disk.All = lpTotalNumberOfBytesdisk.Free = lpTotalNumberOfFreeBytesdisk.Used = lpFreeBytesAvailablereturn
}

在这个示例中,根据不同的操作系统,分别创建了 disc_space_linux.go 和 disc_space_windows.go 两个文件,并使用条件编译指令来选择相应的文件进行编译。

三、【推荐】使用github.com/shirou/gopsutil/disk这个库,如何获取机器下不同磁盘分区的内容

https://github.com/shirou/gopsutil

Go中获取磁盘空间信息,你可以使用第三方库 github.com/shirou/gopsutil/disk 这个库提供了一个跨平台的方法来获取磁盘的使用情况。

gopstuil就是go语言版的psutil,pstuil字面意思是进程和系统实用程序。

gopsutil的挑战在于将pstuil上的函数移植到不同的架构上。所有的通过将C结构体移植到Go结构体来实现,没有cgo。目前支持的架构:

  • FreeBSD i386/amd64/arm
  • Linux i386/amd64/arm(raspberry pi)
  • Windows i386/amd64/arm/arm64
  • Darwin amd64/arm64
  • OpenBSD amd64
  • Solaris amd64

总结:gopsutil 是一个跨平台的库,提供了许多系统和硬件信息的获取方法,包括磁盘使用情况。

func getDiskUsage(path string) (uint64, uint64, error) {//disk.Usage() 函数来获取指定路径的磁盘使用情况usage, err := disk.Usage(path)if err != nil {return 0, 0, err}usedSpace := usage.UsedfreeSpace := usage.Freereturn usedSpace, freeSpace, nil
}

相关文章:

Golang条件编译 | 获取系统的磁盘空间内存占用demo | gopsutil/disk库(跨平台方案)

文章目录 一、Golang条件编译1. 构建标签( Build tags)2. 文件后缀(File suffixes) 二、GO golang 获取磁盘空间 条件编译思路 三、【推荐】使用github.com/shirou/gopsutil/disk这个库,如何获取机器下不同磁盘分区的内容 一、Golang条件编译…...

22/76-池化

池化(最大池化层:选每个kernel中最大的数) 填充、步幅、多个通道: 池化层与卷积层类似,都具有填充和步幅。 没有可学习的参数。 在每个输入通道应用池化层以获得相应的输出通道。 输出通道数输入通道数。 平均池化层…...

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2C(mpu6050陀螺仪和加速度计)SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR1…...

利用HTML和CSS实现的浮动布局

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{m…...

2024年第十届控制、自动化与机器人国际会议(ICCAR 2024)即将召开!

2024年4月27~29日 新加披 会议官网&#xff1a;10th-ICCAR 2024https://iccar.org/index.html 第十届控制、自动化和机器人国际会议将于2024年4月27-29日在新加坡举办。本次会议由新加坡电子学会&#xff0c;IEEE机器人和自动控制协会和IEEE联合主办&#xff0c;并得到北京航空…...

基于python集成学习算法XGBoost农业数据可视化分析预测系统

文章目录 基于python集成学习算法XGBoost农业数据可视化分析预测系统一、项目简介二、开发环境三、项目技术四、功能结构五、功能实现模型构建封装类用于网格调参训练模型系统可视化数据请求接口模型评分 0.5*mse 六、系统实现七、总结 基于python集成学习算法XGBoost农业数据可…...

第29集《佛法修学概要》

丁三、声闻乘 分二&#xff1a;戊一、释义&#xff1b;戊二、四谛法&#xff1b;戊三、结示 请大家打开讲义第八十二页。我们看丁三&#xff0c;声闻乘。 在祖师大德的判教当中&#xff0c;把我们整个大乘的成佛之道分成了三个部分&#xff1a;第一个是安乐道&#xff0c;第…...

奥伦德光电耦合器5G通信领域及其相关领域推荐

光电耦合器是以光为媒介传输电信号的一种电-光-电转换器件。由于该器件使用寿命长、工作温度范围宽&#xff0c;所以在过程控制、工业通信、家用电器、医疗设备、通信设备、计算机以及精密仪器等方面有着广泛应用在当前工艺技术持续发展与提升的过程中&#xff0c;其工作速度、…...

机器学习算法 - 马尔可夫链

马尔可夫链&#xff08;Markov Chain&#xff09;可以说是机器学习和人工智能的基石&#xff0c;在强化学习、自然语言处理、金融领域、天气预测、语音识别方面都有着极其广泛的应用 > The future is independent of the past given the present 未来独立于过去&#xff…...

Linux下防火墙相关命令整理

目录 一.前言二.相关命令整理 一.前言 这篇文章简单整理一下Linux系统中防火墙相关命令。 二.相关命令整理 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld重启防火墙 systemctl restart firewalld开机启用防火墙 systemctl enable firewall…...

Python八股文总结

一. Python基本数据结构有哪四种&#xff1f;区别是什么&#xff1f; 列表&#xff08;List&#xff09;元组&#xff08;Tuple&#xff09;字典&#xff08;Dictionary&#xff09;集合&#xff08;Set&#xff09; 区别主要在于它们的可变性&#xff08;是否可以修改&#x…...

计算机导论05-计算机网络

文章目录 计算机网络基础计算机网络概述计算机网络的概念计算机网络的功能计算机网络的组成 计算机网络的发展计算机网络的类型 网络体系结构网络互联模型OSI/RM结构与功能TCP/IP结构模型TCP/IP与OSI/RM的比较 网络地址与分配IP地址构成子网的划分IPv6 传输介质与网络设备网络传…...

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…...

vi/vim 编辑器 --基本命令

1 vi/vim编辑器介绍 vi 是visual interface 的简称&#xff0c;是Linux中最经典的文本编辑器 vim是vi的加强版。兼容了vi的所有指令&#xff0c;不仅能编辑文本&#xff0c;而且具有shell程序编辑的功能&#xff0c;可以通过不同颜色的字体辨别语法的正确性&#xff0c;极大…...

C++——STL标准模板库——容器详解——set

一、基本概念 set容器是一种具备自动排序功能的集合&#xff0c;默认递增排序&#xff1b;元素无法直接修改&#xff0c;且不能重复&#xff1b;另一个版本叫做multiset&#xff0c;允许存在重复元素&#xff0c;其他功能和性质一样。 set容器底层结构一般为自平衡二叉搜索树…...

Vim一键配置指南,打造高效率C++开发环境

文章目录 前言安装与卸载功能演示gcc/g升级问题 前言 Vim作为当下最受欢迎的文本编译器之一&#xff0c;不仅具有强大的文本编辑功能&#xff0c;还提供了高度的可定制性。用户可以根据自己的喜好自定义配置&#xff0c;并且通过自己编写插件或者使用现有的插件来扩展Vim的功能…...

新航向,新生态: Michael在出海业务圆桌会议分享HyperBDR全球业务拓展之道

1月15日-16日&#xff0c;以“领航新开局&#xff0c;共赢新生态”为主题的华为云生态大会2024在华为云贵安数据中心云上屯盛大举行。本次会议聚焦于华为云全国生态伙伴与开发者&#xff0c;旨在共同见证华为云生态战略的最新进展和伙伴政策的新升级。与会者将分享来自优秀生态…...

SpringBoot异步处理

Spring boot异步处理 业务场景&#xff1a; 如执行数据库备份任务&#xff0c;前端发起请求到后端&#xff0c;后端备份数据库的处理逻辑需要很长一段时间&#xff0c;此时前端会一直等待后端返回结果&#xff0c;给用户给等待时间过长&#xff0c;这是就要考虑异步处理了&…...

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…...

matplotlib绘制动态瀑布图

绘制瀑布图思路&#xff1a;遍历指定文件目录下所有的csv文件&#xff0c;每读一个文件&#xff0c;取文件前20行数据进行保存&#xff0c;如果超过规定的行数300行&#xff0c;将最旧的数据删除&#xff0c;仅保留300行数据进行展示。 网上找的大部分绘制瀑布图的代码&#x…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...