Go语言 在Windows开发人员计算机上编译Linux函数时出现问题

rdlzhqv9  于 2023-03-21  发布在  Go
关注(0)|答案(1)|浏览(258)

我的应用程序在Linux服务器上运行,但我在Windows机器上开发。
我在编译“www.example.com“包中的函数和类型时遇到了问题golang.org/x/sys/unix。下面是我编译不好的部分代码:

if runtime.GOOS == "linux" {
    var stat unix.Statfs_t
    err := unix.Statfs(mount, &stat)
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        continue
    }

    totalSpace = uint64(stat.Blocks) * uint64(stat.Bsize)
    freeSpace = uint64(stat.Bfree) * uint64(stat.Bsize)
}

我正在使用JetBrains的Goland进行编译。我收到以下错误:“未定义:unix.Statfs_t”和“未定义:unix.statfs”,“编译已完成,退出代码为2”。
我用go get -u "golang.org/x/sys/unix"导入了这个包,但是我还是得到了这个错误。有人知道如何修复这个错误吗?

bvn4nwqk

bvn4nwqk1#

Go语言源文件包的导入是由编译器处理的,运行时检查runtime.GOOS == "linux"不起作用;那就太晚了,用Go语言编译器构建约束。
对于Linux和Windows,使用显式和文件名隐式构建约束,
disk/disk.go

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    mount := string(filepath.Separator)
    total, free, err := DiskSpace(mount)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    fmt.Println(total, free)
}

disk/disk_linux.go

package main

import (
    "golang.org/x/sys/unix"
)

func DiskSpace(mount string) (total, free uint64, err error) {
    var stat unix.Statfs_t
    err = unix.Statfs(mount, &stat)
    if err != nil {
        return 0, 0, err
    }
    total = uint64(stat.Blocks) * uint64(stat.Bsize)
    free = uint64(stat.Bfree) * uint64(stat.Bsize)
    return total, free, nil
}

disk/disk_windows.go

package main

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

func DiskSpace(dir string) (total, free uint64, err error) {
    var (
        directoryName              = windows.StringToUTF16Ptr(dir)
        freeBytesAvailableToCaller uint64
        totalNumberOfBytes         uint64
        totalNumberOfFreeBytes     uint64
    )
    err = windows.GetDiskFreeSpaceEx(
        directoryName,
        &freeBytesAvailableToCaller,
        &totalNumberOfBytes,
        &totalNumberOfFreeBytes,
    )
    if err != nil {
        return 0, 0, err
    }
    return totalNumberOfBytes, totalNumberOfFreeBytes, nil
}

disk/disk_other.go

//go:build !(linux || windows)

package main

import (
    "fmt"
)

func DiskSpace(mount string) (total, free uint64, err error) {
    err = fmt.Errorf("DiskSpace not implemented for this OS")
    return 0, 0, err
}

在Linux上:

disk$ go build && ./disk
64183046144 37856325632
$

在Windows上:

disk>go build && disk.exe
205507317760 59385081856
>

您可能需要考虑使用WSL进行开发。
Windows Subsystem for Linux (WSL)允许开发人员直接在Windows上运行GNU/Linux环境,无需修改,无需传统虚拟机或双引导设置的开销。

相关问题