GOLANG:在运行时为不同的操作系统选择func的正确方法

时间:2013-12-06 13:04:00

标签: go

我非常喜欢使用GO可以获得的许多任务的交叉编译/平台简易性。我想,我有一个问题,相当于#ifdef / #else类型的构造,用于根据操作系统执行/编译函数。

这是场景 - 假设我有一个函数将信息插入操作系统的控制结构,以便在用户下次启动系统时启动进程。在Windows上,我会更新用户的“RUN / RUNONCE”注册表项,在MAC上会有一个plist条目等。

从本质上讲,我希望能够编写类似于此的人(或者具有超载的OS特定功能):

func setStartupProcessLaunch () {
    if [OS is Windows] {
        updateRegistry(){}
    } else if [OS is Darwin] {
        updatePlist(){}
    } else if [OS is Linux] {
        doLinuxthing() {}
    }
}

给定静态编译,任何未调用的例程都将被标记为编译错误。理想情况下,我想在#ifdef WINDOWS,#ifdef MAC类型的块中包围我的'doSpecificOS()'函数 - 实现这个的正确方法是什么?我希望我不需要为每个OS平台创建相同程序的多个项目树。

THX!

3 个答案:

答案 0 :(得分:17)

您可以使用以下格式创建文件:<pkgname>_<osname>.go

例如:

  • your_package_linux.go
  • your_package_darwin.go
  • your_package_windows.go

每个文件都可以包含具体操作系统的函数定义,在您的情况下它是func setStartupProcessLaunch()

您可以在标准 os / signal for example中看到它是如何实现的。

答案 1 :(得分:10)

您可以在这里阅读构建约束 http://golang.org/pkg/go/build/(您可以制作三个文件,每个文件都有特定操作系统的逻辑)
或者您也可以查看 runtime.GOOS 以获取操作系统名称字符串

答案 2 :(得分:-1)

如果所有参数都采用相同数量/种类的参数并具有相同的返回类型,则可以将函数放在数组或映射中。

以下是一个例子来说明:

package main

import (
"fmt"
)

var functionMap = map[string]func(int)int{}
var functionArray = [2]func(int)int{nil, nil}

func windowsFunc(x int) int {
    fmt.Printf("Hi from windowsFunc(%d)\n", x)
    return 0 
}

func linuxFunc(x int) int {
    fmt.Printf("Hi from linuxFunc(%d)\n", x)
    return 1
}


func main() {
    functionMap["Windows"] = windowsFunc
    functionMap["Linux"] = linuxFunc

    functionArray[0] = windowsFunc
    functionArray[1] = linuxFunc

    fmt.Printf("Calling functionMap[\"Windows\"]: ")
    functionMap["Windows"](123)

    fmt.Printf("Calling functionArray[1]: ")
    functionArray[1](456)
}

输出是:

  

调用functionMap [“Windows”]:您好,来自windowsFunc(123)
  调用functionArray [1]:您好,来自linuxFunc(456)