在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
fzdwx 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
二楼很一针见血了
|