在Windows下开发, 有时候会用到一些系统库, 因此会用到syscall, 比如最近项目中需要设置Windows控制台窗口标题, 在开发时也考虑到了跨平台的情况, 还特意在代码中加了
if runtime.GOOS != "windows" {
}
但时到Linux下编译不过, 因为syscall的接口分不同平台, 有点仅支持Windows.
自然而然想到了go的编译控制:
在文件头加入如下标签:
//+build windows
然后编译的时候添加tag参数
go build -tags="windows"
比如我这里就会存在两个文件 func_windows.go:
//+build windows
package global
import (
"syscall"
"unsafe"
)
// 设置cmd窗口标题
func SetCmdTitle(title string) {
kernel32, _ := syscall.LoadLibrary(`kernel32.dll`)
sct, _ := syscall.GetProcAddress(kernel32, `SetConsoleTitleW`)
strUtf16,_ := syscall.UTF16PtrFromString(title)
syscall.Syscall(sct, 1, uintptr(unsafe.Pointer(strUtf16)), 0, 0)
syscall.FreeLibrary(kernel32)
}
和 func_linux.go:
//+build linux
package global
func SetCmdTitle(title string) {
}
这样在不同的平台加各自的标签进行build就可以了, 不会报错.