我在暴躁同事小张的胁迫下学会了Go的交叉编译和条件编译

本文介绍Go语言中的交叉编译和条件编译技巧,通过实例演示如何针对不同平台编译同一份代码,解决因依赖系统特性导致的编译问题。

今天继续关于Go开发经验的分享,这次的主题是关于Go的交叉编译和条件编译,伴随着我对自己打不过、惹不起的壕同事小张还有运维们的碎碎念。

交叉编译

交叉编译是用来在一个平台上生成另一个平台的可执行程序。比如我工作开发时用的Mac,系统内核是darwin,小张用的是外星人,系统内核是windows (小张明显比我有钱,我的Mac是公司发的,人家的外星人是为打游戏自己买的)。

那么假如我编写的代码依赖了系统底层平台或处理器架构特性的Go包时,比如说我上周在文章《Go服务迁到K8s后老抽风重启? 记一次完整的线上问题解决过程》里写的,为了把Go运行时的panic错误重定向到日志文件,我用了syscall.Dup2这个函数把标准错误原来的文件描述符替换成了自己指定的日志文件的描述符。syscall.Dup2Go语言在类Unix系统,X86_64架构下才有的函数库,在Mac系统上、各种服务器环境上编译都没有问题,但是唯独在像小张这样不用办公电脑的土豪们用的Windows系统上编译不过去。

所以在上篇文章说的那个为了追踪在Kubernetes上服务老重启的问题,用syscall.Dup2重定向标准输出的解决方案是有副作用的,我贴一下之前这个功能的代码。

func RewriteStderrFile() error {
   if runtime.GOOS == "windows" {
      return nil
   }
   ......
    file, err := os.OpenFile(stdErrFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
      fmt.Println(err)
        return err
    }
    
    if err = syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd())); err != nil {
        fmt.Println(err)
        return e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值