当前位置: 首页 > 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…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...