美文网首页
golang 条件编译

golang 条件编译

作者: 陈sir的知识图谱 | 来源:发表于2019-08-16 11:36 被阅读0次

实现方式

在源代码的开头第一行指定需要编译的平台,比如要获取磁盘大小,linux和win 平台的方法是不一样的。注意 编译条件的注释和package 语句之间一定要隔一行。不然无法识别编译条件,编译条件支持“非”逻辑,比如某个文件在非 windows 环境下编译,可以写作
// +build !wiondows
windisk.go

// +build windows

package diskinfo // 注意 编译条件的注释和package 语句之间一定要隔一行。不然无法识别编译条件

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os/user"
    "runtime"
    "syscall"
    "unsafe"

    "github.com/astaxie/beego/httplib"
    "github.com/go-yaml/yaml"
    "github.com/shirou/gopsutil/cpu"
    "github.com/shirou/gopsutil/disk"
    "github.com/shirou/gopsutil/host"
    "github.com/shirou/gopsutil/mem"
    "github.com/shirou/gopsutil/net"
)


func getDiskSpace(disks []disk.PartitionStat) ([]restentity.DiskStatus) {
    logging.Info.Printf("cuurent os %s", runtime.GOOS)
    var diskStatusList []restentity.DiskStatus

    kernel32, err := syscall.LoadLibrary("Kernel32.dll")
    if err != nil {
        logging.Error.Panic(err)
    }
    defer syscall.FreeLibrary(kernel32)
    GetDiskFreeSpaceEx, err2 := syscall.GetProcAddress(syscall.Handle(kernel32), "GetDiskFreeSpaceExW")

    if err2 != nil {
        logging.Error.Panic(err)
    }

    lpFreeBytesAvailable := uint64(0)
    lpTotalNumberOfBytes := uint64(0)
    lpTotalNumberOfFreeBytes := uint64(0)
    for _, partion := range disks {
        r, a, b := syscall.Syscall6(uintptr(GetDiskFreeSpaceEx), 4,
            uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(partion.Mountpoint))),
            uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
            uintptr(unsafe.Pointer(&lpTotalNumberOfBytes)),
            uintptr(unsafe.Pointer(&lpTotalNumberOfFreeBytes)), 0, 0)
            usedSpace:=lpTotalNumberOfBytes-lpTotalNumberOfFreeBytes
        logging.Info.Println("--------------------------------------------")
        logging.Info.Println(r, a, b, lpFreeBytesAvailable, lpTotalNumberOfBytes, usedSpace)
        logging.Info.Println("--------------------------------------------")

        diskStatus := restentity.DiskStatus{
            All: lpTotalNumberOfBytes,
            Used: usedSpace,
            Free: lpFreeBytesAvailable,
            Partion: partion,
        }
        diskStatusList=append(diskStatusList,diskStatus)
    }
    return diskStatusList
}

linuxdisk.go

// +build linux

// 编译条件支持“非逻辑” +build linux 可以用 +build !windows 替换
package registerservice

func getDiskSpace(disks []disk.PartitionStat) []restentity.DiskStatus {
    logging.Info.Printf("cuurent os %s", runtime.GOOS)
    var diskStatusList []restentity.DiskStatus

    fs := syscall.Statfs_t{}
    for _, partion := range disks {
        err := syscall.Statfs(partion.Mountpoint, &fs)
        if err != nil {
            return nil
        }
        usedSpace := fs.Blocks*uint64(fs.Bsize) - fs.Bfree*uint64(fs.Bsize)
        diskStatus := restentity.DiskStatus{
            All:     fs.Blocks * uint64(fs.Bsize),
            Used:    usedSpace,
            Free:    fs.Bfree * uint64(fs.Bsize),
            Partion: partion,
        }
        diskStatusList = append(diskStatusList, diskStatus)
    }
    return diskStatusList
}

相关文章

  • golang 条件编译

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

  • golang条件编译

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

  • golang条件编译方式

    编译标签方式 例如: 在源码头部放置条件编译标签,将限制文件仅能在BSD系统进行编译 当一个文件有多个编译标签,总...

  • Golang 交叉编译

    [TOC] 说明 本文交叉编译需要 1.5 以上 Golang Mac 下编译 windows 64 Golang...

  • golang进行交叉编译

    golang进行交叉编译 交叉编译即编译不同操作系统平台的可执行程序 golang执行交叉编译,只需要使用两个变量...

  • go如何进行交叉编译

    golang交叉编译 问题 golang如何在一个平台编译另外一个平台可以执行的文件。比如在mac上编译Windo...

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

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

  • go 语言学习

    Golang 在 Mac、Linux、Windows 下如何交叉编译 Mac 下编译 Linux 和 Window...

  • Golang在Mac OS上的环境配置

    Golang是Google开发的一种编译型,平行化,具有垃圾回收功能的编译语言,还和C一样有指针。Golang是天...

  • Golang聚合

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

网友评论

      本文标题:golang 条件编译

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