Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在运行时为不同的操作系统选择func的正确方法_Go - Fatal编程技术网

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

Go 在运行时为不同的操作系统选择func的正确方法,go,Go,我非常喜欢使用GO可以完成的许多任务的跨编译/平台轻松性。我想,我有一个问题,关于执行/编译基于操作系统的函数的#ifdef/#else类型构造的等价物 下面是一个场景——假设我有一个函数,可以将信息插入操作系统的控制结构,以便在用户下次启动系统时启动一个进程。在Windows上,我会为用户更新“RUN/RUNONCE”注册表项,在MAC上会有一个plist项,等等 本质上,我希望能够编写与此类似的人(或具有过载的操作系统特定函数): 给定静态编译,任何未调用的例程都将标记为编译错误。因此,理想

我非常喜欢使用GO可以完成的许多任务的跨编译/平台轻松性。我想,我有一个问题,关于执行/编译基于操作系统的函数的#ifdef/#else类型构造的等价物

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

本质上,我希望能够编写与此类似的人(或具有过载的操作系统特定函数):


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

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

下面是一个例子来说明:

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的Hi(123)
调用functionArray[1]:来自linuxFunc(456)的Hi


您可以在此处阅读有关构建约束的内容(您可以创建三个文件,每个文件都有特定操作系统的逻辑)

或者您可以检查操作系统名称字符串的,您可以使用以下模式创建文件:
\uuuu.go

例如:

  • 您的\u包\u linux.go
  • 你的包裹去吧
  • 您的\u软件包\u windows.go
每个文件都可以包含具体操作系统的函数定义,在您的示例中,它是
func setStartupProcessLaunch()


您可以看到它是如何在标准的操作系统/信号包中实现的。

谢谢链接!非常感谢。我考虑过这样做-只是有一个(奇怪的)偏好在单个文件中查看:-@user2644113构建约束会导致更小的对象文件,无论如何,如果需要在单个文件中使用函数,请使用runtime.GOOS,但要小心,因为它无法编译,如果您将使用一些特定于操作系统的系统调用,信号,等等。这里有一个来自golang巡回赛的例子-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)
}