golang获取系统磁盘信息

发布时间:2024-12-23 00:32:32

Go语言(Golang)是一个开源的、跨平台的编程语言,由Google团队开发。它拥有高效的并发模型和内置的系统编程功能,适用于各种任务和应用场景。在使用Go语言开发系统时,获取系统磁盘信息是一个常见的需求。本文将介绍如何使用Golang获取系统磁盘信息。

使用Golang获取磁盘列表

首先,我们需要获取系统中所有的磁盘列表。Golang提供了os包和syscall包来实现这个目标。首先,我们导入这两个包:

import ( "os" "syscall" )

然后,我们使用os包中的Stat函数来获取系统的文件信息:

func getDiskList() ([]string, error) { var diskList []string drives, err := os.ReadDir("/") if err != nil { return nil, err } for _, drive := range drives { if drive.IsDir() { fi, err := os.Lstat("/" + drive.Name()) if err != nil { continue } if (fi.Mode() & os.ModeDevice) == os.ModeDevice { diskList = append(diskList, drive.Name()) } } } return diskList, nil }

获取磁盘使用情况

接下来,我们需要获取每个磁盘的使用情况。Golang提供了syscall包中的Statfs函数来获取文件系统的统计信息。我们可以使用该函数来获取磁盘的总容量、可用空间等信息:

func getDiskUsage(disk string) (DiskUsage, error) { var du DiskUsage fs := syscall.Statfs_t{} err := syscall.Statfs("/" + disk, &fs) if err != nil { return du, err } blockSize := uint64(fs.Bsize) totalBlocks := fs.Blocks freeBlocks := fs.Bfree du.Total = totalBlocks * blockSize du.Available = freeBlocks * blockSize du.Used = du.Total - du.Available return du, nil }

完整代码示例

下面是一个完整的使用Golang获取系统磁盘信息的示例代码:

package main import ( "fmt" "os" "syscall" ) type DiskUsage struct { Total uint64 Available uint64 Used uint64 } func getDiskList() ([]string, error) { var diskList []string drives, err := os.ReadDir("/") if err != nil { return nil, err } for _, drive := range drives { if drive.IsDir() { fi, err := os.Lstat("/" + drive.Name()) if err != nil { continue } if (fi.Mode() & os.ModeDevice) == os.ModeDevice { diskList = append(diskList, drive.Name()) } } } return diskList, nil } func getDiskUsage(disk string) (DiskUsage, error) { var du DiskUsage fs := syscall.Statfs_t{} err := syscall.Statfs("/" + disk, &fs) if err != nil { return du, err } blockSize := uint64(fs.Bsize) totalBlocks := fs.Blocks freeBlocks := fs.Bfree du.Total = totalBlocks * blockSize du.Available = freeBlocks * blockSize du.Used = du.Total - du.Available return du, nil } func main() { diskList, err := getDiskList() if err != nil { fmt.Println("Failed to get disk list:", err) return } for _, disk := range diskList { usage, err := getDiskUsage(disk) if err != nil { fmt.Printf("Failed to get disk usage for %s: %v\n", disk, err) continue } fmt.Printf("Disk: %s\n", disk) fmt.Printf("Total: %.2f GB\n", float64(usage.Total)/(1024*1024*1024)) fmt.Printf("Available: %.2f GB\n", float64(usage.Available)/(1024*1024*1024)) fmt.Printf("Used: %.2f GB\n", float64(usage.Used)/(1024*1024*1024)) fmt.Printf("\n") } }

通过以上代码,我们可以获取系统中所有磁盘的使用情况,并输出到控制台。可以根据实际需求进行自定义处理,例如将获取到的信息存储到数据库,或者根据不同的使用情况进行告警处理等。

相关推荐