美文网首页
GO golang 获取磁盘空间 条件编译

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

作者: 勤劳一沙鸥 | 来源:发表于2017-12-05 18:23 被阅读907次

原文:在Golang中获取系统的磁盘空间内存占用

获取磁盘占用情况(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.Free
    return
}

我用的MAC做开发。亲测有效,很愉快的复制代码使用去了。
当前时间为2017年12月, go 1.9.2,距离博客时间已经5年了,兼容性不错

后来要编一个给windows的同事用,出问题了

先说一下,跨平台编译命令

# GOOS=windows GOARCH=amd64 go build

指定目标在windows平台,64位。OS有很多,不罗列了

错误信息

# utils/system.go:17:8: undefined: syscall.Statfs_t
# utils/system.go:18:9: undefined: syscall.Statfs

做为资深码农,我一下子就想到这应该是底层代码跨平台出了问题。为了解决这个问题,实施方案:

  1. 找到windows下获取磁盘的代码
  2. 条件编译,根据目标系统,选择代码

windows下获取磁盘空间的方法

也是在开头的博客里找来的,但方法已做兼容性处理,否则不能通过

package utils

import "unsafe"
import (
    "golang.org/x/sys/windows"
)

type DiskStatus struct {
    All  uint64
    Used uint64
    Free 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 = lpTotalNumberOfBytes
    disk.Free = lpTotalNumberOfFreeBytes
    disk.Used = lpFreeBytesAvailable
    return
}

条件编译

大概就是不同的目标,使用不同的代码。 这就是跨平台的代价吧。

资料

我在项目中用到的方法,创建了两个文件,并在 other文件内,添加非windows平台才参加编译的指令。

# system_other.go
// +build !windows

package utils

-----------------------------------
# system_windows.go
// +build windows

package utils

条件编译需要前后空一行,否则无法识别,比如system_other.go文件中的条件编译下面会空一行在写代码
活到老,学到老~~

相关文章

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

    原文:在Golang中获取系统的磁盘空间内存占用 获取磁盘占用情况(Linux/Mac下有效) 我用的MAC做开发...

  • Golang聚合

    教程 Go Web 编程Go语言圣经(中文版) Tips Golang 学习笔记——交叉编译 & 部署Golang...

  • 开始编写Golang代码

    开始编写Golang代码 介绍 本文主要讲述如何写一个简单的Go包和如何使用golang的工具,如何获取、编译和安...

  • Logrus的使用

    Logrus is a structured logger for Golang 获取 go get github...

  • macOS Golang 1.5+ 跨平台编译

    Go (Golang) GOOS and GOARCH 列表 跨平台编译时命令示例

  • Golang Protobuf

    编译安装编译器protoc 安装插件 go get -u github.com/golang/protobuf/p...

  • golang 条件编译

    实现方式 在源代码的开头第一行指定需要编译的平台,比如要获取磁盘大小,linux和win 平台的方法是不一样的。注...

  • golang条件编译

    开篇 golang中没有类似C语言中条件编译的写法,比如在C代码中可以使用如下语法做一些条件编译,结合宏定义来使用...

  • go安装使用

    获取资源 https://golang.org/doc/install?download=go1.11.2.lin...

  • MacOS Monterey安装 Golang

    Golang 简介 Go(又称Golang),是 Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回...

网友评论

      本文标题:GO golang 获取磁盘空间 条件编译

      本文链接:https://www.haomeiwen.com/subject/fwicixtx.html