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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js设计与实现阅读-2

Vue.js设计与实现阅读-2 1、前言2、框架设计的核心要素2、1 提升用户体验2、2 控制代码体积2、3 Tree-Shaking2、4 特性开关2、5 错误处理 1、前言 上一篇我们了解到了 命令式和声明式的区别,前者关注过程,后者关注结果了解了虚拟dom存在的意义&#x…

Ubuntu22.04 netplan 网络配置

Ubuntu18.04修改IP地址的方法(error in network definition ......is missing /prefixlength)_error in network definition: expected sequence-CSDN博客 Ubuntu20.04 单网卡配置多ip_ubuntu单网卡多ip-CSDN博客 ubuntu配置多网段IP-CSDN博客 Netplan使用(高版…

把应用转为LINUX服务失败,两个奇怪错误

应用经常崩溃,于是就想转为服务,让系统帮忙重启。这个事情当然信心满满,咱之前做过,最近也刚刚实验过。想法是好的,现实是残酷的,遇到两个问题无解: 访问内存失败 经过定位,确认是…

CMake入门教程【实战篇】Ninja环境搭建与加速项目构建

文章目录 1.什么是Ninja?2.为什么选择Ninja?3.Ninja的特点4.如何使用Ninja5.vscode+msvc+cmake+ninja示例命令行操作示例vscode1.什么是Ninja? Ninja是一个专注于速度的小型构建系统。与其他构建系统不同,Ninja采用了一种低级方法,旨在实现快速的增量构建。它的设计理念是…

笔记软件内怎么查看文章字数 笔记查看字数的操作步骤

在记录生活点滴、工作要务时,你是否曾像我一样,为了知道写了多少字而犯愁?尤其是在需要精确控制字数时,那种焦虑感更是如影随形。 记得有一次,我为了一个项目报告苦思冥想,好不容易写了个初稿,…

Java--ListUtil工具类,实现将一个大列表,拆分成指定长度的子列表

文章目录 前言实现代码执行结果 前言 在项目中有时会出现列表很大,无法一次性批量操作,我们需要将列表分成指定大小的几个子列表,一份一份进行操作,本文提供这样的工具类实现这个需求。 实现代码 以下为代码实现: …

源码编译FFmpeg4.3

FreeSWITCH的mod_av模块目前(1.10.11)暂不支持FFmpeg4.4(或者更高版本),但4.3就没问题 最近试了试源码编译FFmpeg4.3,记录如下(系统centos7.9): git clone GitHub - Bt…

Rust语言的Hello, World! 程序解析

Rust是一门现代系统编程语言,注重内存安全和并发性。让我们从一个经典的 “Hello, World!” 程序开始,逐步解析它的每个部分。 fn main() {println!("Hello, world!"); }1. fn main() { ... } 在Rust中,程序的执行从 main 函数开…

锂电池的电压和容量怎么计算?

锂电池组是由电池单体(电芯)通过串并联来组成 1、串联(S)增加电压,容量不变。 例如:1个磷酸铁锂电池的额定电压为3.2V,容量为4000mAH,将10个磷酸铁锂电芯串联,电池组电压:3.2v*10&a…

目标检测正负样本分配策略----ATSS

一、ATSS 参考:https://blog.csdn.net/xuzz_498100208/article/details/110355048 https://zhuanlan.zhihu.com/p/411659547 作者提出了一种自适应的选取正样本的方法,具体方法如下: 1.对于每个输出的检测层,选计算每个anchor的中…

Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

在 Spring 中,Async 注解用于将方法标记为异步执行的方法。当使用 Async 注解时,该方法将在单独的线程中执行,而不会阻塞当前线程。这使得方法可以在后台执行,而不会影响主线程的执行。 在您提供的代码示例中,a1() 和…

java-面向对象

什么是类?什么是对象? - 现实生活中是由很多很多对象组成的,基于对象抽出了类 - 对象:软件中真实存在的单个个体/东西 类:类别/类型,代表一类个体 - 类是对象的模子,对象是类的具体的实例 - 类中…

【gpt4 8k 免费使用】Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台

Coze 快速开始 | Coze Welcome to Coze Coze 是什么? Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上。…

【C++】类和对象之匿名对象友元内部类

目录 一、匿名对象 1、基础格式 2、使用场景 二、友元 1、友元函数 2、友元类 三、内部类 1、概念 2、特性 四、拷贝对象时的一些编译器优化 1、函数传参 2、对象返回 一、匿名对象 1、基础格式 【注意】 🟢匿名对象的声明周期只有当前行,进入…

[计算机提升] 创建FTP共享

4.7 创建FTP共享 4.7.1 FTP介绍 在Windows系统中,FTP共享是一种用于在网络上进行文件传输的标准协议。它可以让用户通过FTP客户端程序访问并下载或上传文件,实现文件共享。 FTP共享的用途非常广泛,例如可以让多个用户共享文件、进行文件备份…

超越5大最先进的文本到视频系统!MagicVideo-V2:多阶段高保真视频生成框架(字节)

本项工作介绍了MagicVideo-V2,将文本到图像模型、视频运动生成器、参考图像embedding模块和帧内插模块集成到端到端的视频生成流程中。由于这些架构设计的好处,MagicVideo-V2能够生成具有极高保真度和流畅度的美观高分辨率视频。通过大规模用户评估&…

【设计模式-6】建造者模式的实现与框架中的应用

建造者模式又被成为生成器模式,是一种使用频率比较低,相对复杂的创建型模式,在很多源码框架中可以看到建造者的使用场景,稍后我们会在本文末尾展示几个框架的使用案例。  建造者模式所构造的对象通常是比较复杂而且庞大的&#x…

【Unity】Android实现跳转应用设置(权限)

为了应对Google推荐要求,需要在申请权限时进行提示可跳转应用设置界面,开启权限来保证功能正常进行。 MainActivity.java下(继承Activity)//跳转至应用设置界面public void JumpAppSetting(){Intent intent new Intent();intent.setAction(android.pro…

Day31 贪心算法 part01 理论基础 455.分发饼干 376.摆动序列 53.最大子序和

贪心算法 part01 理论基础 455.分发饼干 376.摆动序列 53.最大子序和 理论基础(转载自代码随想录) 什么是贪心 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 这么说有点抽象,来举一个例子: 例如&#…