我非常喜欢使用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() {}
}
}
Run Code Online (Sandbox Code Playgroud)
给定静态编译,任何未调用的例程都将被标记为编译错误.理想情况下,我想在#ifdef WINDOWS,#ifdef MAC类型的块中包围我的'doSpecificOS()'函数 - 实现此目的的正确方法是什么?我希望我不需要为每个OS平台创建相同程序的多个项目树.
谢谢!
nvc*_*nvn 10
你可以阅读有关建立约束这里http://golang.org/pkg/go/build/(你可以让三个文件,每个文件都有一个特定的操作系统的逻辑),
或者你可以检查runtime.GOOS的OS名字串
Mic*_*ael -3
如果函数都采用相同数量/种类的参数并且具有相同的返回类型,则可以将函数放入数组或映射中。
下面举一个例子来说明:
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)
}
Run Code Online (Sandbox Code Playgroud)
输出是:
调用 functionMap["Windows"]:Hi,来自 windowsFunc(123)
调用 functionArray[1]:Hi,来自 linuxFunc(456)
| 归档时间: |
|
| 查看次数: |
5304 次 |
| 最近记录: |