在Windows
下编写的,Linux
相关的那段代码无法通过编译,提示"Unresolved type 'Statvfs_t'"
加了判断根据系统调用不同的函数,也不行吗?
那要怎么解决?
//go:build windows || linux package main import ( "fmt" "golang.org/x/sys/windows" "os" "runtime" "syscall" ) // 获取磁盘的可用空间。依次为 可用空间、总空间、剩余空间(包含系统保留) // // 参考 https://stackoverflow.com/a/60724929 func get() (free uint64, total uint64, avail uint64, err error) { wd, err := os.Getwd() if err != nil { return } switch runtime.GOOS { case "windows": pathPtr, err := windows.UTF16PtrFromString(wd) if err != nil { return } err = windows.GetDiskFreeSpaceEx(pathPtr, &free, &total, &avail) if err != nil { return } case "linux": var stat syscall.Statvfs_t if err := syscall.Statvfs(wd, &stat); err != nil { fmt.Println(err) return } // 块大小 = fragment 大小 * fragment 个数(单位为字节) blockSize := uint64(stat.Frsize) // 可用空间 = 块大小 * 可用块数(单位为字节) free = stat.F_bfree * blockSize // 总空间 = 块大小 * 总块数(单位为字节) total = stat.F_blocks * blockSize // 剩余空间 = 块大小 * 剩余块数(单位为字节) avail = stat.F_bavail * blockSize default: return 0, 0, 0, fmt.Errorf("未适配的平台'%s'", runtime.GOOS) } return }
1 lllllliiii 2023-04-18 15:47:14 +08:00 via Android 分文件,同名函数以及 go build 指定平台 |
![]() | 2 likeunix 2023-04-18 15:50:32 +08:00 不是在运行时判断,而是在编译时判断 |
![]() | 3 lincanbin 2023-04-18 15:54:34 +08:00 不同平台的代码放在不同 package 里,编译脚本去检测环境,根据环境去全仓库替换包名。 |
4 NessajCN 2023-04-18 15:55:51 +08:00 不是都告诉你"Unresolved type 'Statvfs_t'"了吗... 你类型名字打错了,是 syscall.Statfs_t |
![]() | 5 qxooqx 2023-04-18 16:08:25 +08:00 关键字 构建约束 添加注释,或者指定文件名就可以了 |
6 cyp0633 2023-04-18 16:26:53 +08:00 要分 // +build windows 和 // +build linux 俩文件吧 |
![]() | 7 Trim21 2023-04-18 16:32:58 +08:00 via Android 要分文件加构建约束,而且你打错字了 |
![]() | 8 icoming OP |
![]() | 11 hugo54 2023-04-19 00:32:51 +08:00 二楼很一针见血了 |