go如何进行交叉编译

golang交叉编译

问题

golang如何在一个平台编译另外一个平台可以执行的文件。比如在mac上编译Windows和linux可以执行的文件。那么我们的问题就设定成:如何在mac上编译64位linux的可执行文件。

解决方案

golang的交叉编译要保证golang版本在1.5以上,本解决方案实例代码1.9版本执行的。 我们想要编译的文件hello.go hello.go

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

在mac上编译64位linux的命令编译命令 bash:

GOOS=linux GOARCH=amd64 go build hello.go

上面这段代码直接在命令控制台里面运行就可以生成64位linux的可执行程序。 参数解析 这里用到了两个变量:

GOOS:目标操作系统 GOARCH:目标操作系统的架构

OS|ARCH|OS version –|—-|——— linux|386 / amd64 / arm|>= Linux 2.6 darwin|386 / amd64|OS X (Snow Leopard + Lion) freebsd|386 / amd64|>= FreeBSD 7 windows|386 / amd64|>= Windows 2000

编译其他平台的时候根据上面表格参数执行编译就可以了。 扩展阅读 在网络上的诸多教程中可能会看到下面的编译命令

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build hello.go

其中CGO_ENABLED=0的意思是使用C语言版本的GO编译器,参数配置为0的时候就关闭C语言版本的编译器了。自从golang1.5以后go就使用go语言编译器进行编译了。在golang1.9当中没有使用CGO_ENABLED参数发现依然可以正常编译。当然使用了也可以正常编译。比如把CGO_ENABLED参数设置成1,即在编译的过程当中使用CGO编译器,我发现依然是可以正常编译的。 实际上如果在go当中使用了C的库,比如import “C”默认使用go build的时候就会启动CGO编译器,当然我们可以使用CGO_ENABLED=0来控制go build是否使用CGO编译器。 以上若有错误欢迎指正。

作者:ppmoon 链接:https://www.jianshu.com/p/4b345a9e768e 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

网站接入代码高亮

highlight.js

使用bower安装的起了一半作用,有背景色,具体代码没有高亮,手动下载的可以

go语言开发grpc——安装grpc

一、安装gRPC

$ go get -u google.golang.org/grpc

package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)

grpc的源码库迁移到了github上,所以需要手动下载了。grpc-go 正常情况下按照以下方式就可安装完成

git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc

git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net

git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text

go get -u github.com/golang/protobuf/{proto,protoc-gen-go}

git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto

cd $GOPATH/src/

go install google.golang.org/grpc

但是在某些情况可能连git clone都不行。就像下面这样的:

$  git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
Cloning into 'E:\go-work/src/google.golang.org/genproto'...
fatal: unable to access 'https://github.com/google/go-genproto.git/': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

这种情况自带梯子可以,如果没有梯子不能通过git clone的话就download吧!

$ git clone https://github.com/grpc/grpc-go.git grpc

Cloning into 'grpc'...
fatal: unable to access 'https://github.com/grpc/grpc-go.git/': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

虽然grpc源码迁到了github上,但是包名并未随着修改,使用的还是google.golang.org,所以需要在src目录下新建google.golang.org目录,并把下载的grpc-go-master.zip解压到google.golang.org目录下,重命名为grpc

grpc包依赖genproto,下载解压后放在grpc同级目录,报名重命名为genproto

git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net

git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text

二、安装protoc编译器

protobuf下载对应平台的编译器: protoc-<version>-<platform>.zip 比如我下载文件名为:protoc-3.7.0-rc-2-win64.zip,解压后的目录为:

E:.
│  readme.txt
│
├─bin
│      protoc.exe
│
└─include
    └─google
        └─protobuf
            │  any.proto
            │  api.proto
            │  descriptor.proto
            │  duration.proto
            │  empty.proto
            │  field_mask.proto
            │  source_context.proto
            │  struct.proto
            │  timestamp.proto
            │  type.proto
            │  wrappers.proto
            │
            └─compiler
                    plugin.proto

复制protoc.exe文件到GOPATH的bin目录下。这时就可以执行protoc命令了

$ protoc.exe -h Usage: E:\go-work\bin\protoc.exe [OPTION] PROTO_FILES Parse PROTO_FILES and generate output based on the options given: -IPATH, --proto_path=PATH Specify the directory in which to search for imports. May be specified multiple times;

但是还需要安装protoc-gen-go插件,可以产生go相关代码, 除上述序列化和反序列化代码之外, 还增加了一些通信公共库。

$ go get -u github.com/golang/protobuf/protoc-gen-go

还是不能正常下载的话,那就老办法,手动下载protoc-gen-go

解压后将protoc-gen-go目录复制到src/github.com/目录下。

$ cd protoc-gen-go

$ go install

会在$GOPATH/bin目录下生成protoc-gen-go文件。

到此,go语言开发grpc所需的工具已经安装完成。


使用pm2作为golang的守护进程

开发过nodejs的人对于pm2再熟悉不过了,而pm2不止可以作为nodejs的守护进程,同样可以用在golang上,使用方法同样很简单:

pm2 start bin

直接启动go二进制文件即可。

https://pm2.io/doc/en/runtime/guide/process-management/


说道说道前后端分离

要说前端界的发展速度,那真是快! 2012年那时候接触过extjs,用于企业级后台开发还真不错,有好看的UI界面,组件丰富,基本能满足各类需求。但此时,HTML5正在蓬勃发展,尤其是乔布斯宣布苹果设备不支持flash后HTML5发展更是迅猛。并且angularjs这类MVVM框架被大多数所知,reactjs,vuejs如雨后春笋般生长。

2014年使用了一段时间angularjs,感觉学习难度有点大,2015年使用vue1.0做了一个项目后我逢人就说angular,vue有多好用,推荐他们放弃jquery使用vue。不到2年时间再看看前端界,vue,react等框架已经是前端开发标配,如果你说公司项目还在使用jquery会被人笑话,对于前端新人MVVM框架是必学,jquery反而不会重视。

这就导致一个结果:“手里拿着锤子,看什么都是钉子”,因为有锤子的关系,遇到任何问题,都会先想如何用锤子解决。久而久之,陷入了一种思维定式。任何工具带来便利的同时,也带来了局限性。而这往往是用锤子的人很难看到的。就拿一个需要SEO的网站来说,该选择哪种技术好?如果只会vue,不熟悉jquery的人来说肯定是选择vue,就算vue不太适合做这类网站,也会拿出ssr来强行做事。殊不知需要SEO的网站使用静态文件是最合适的。大多数人认为前后端分离是使用vue,react,angular,使用jquery的不叫前后端分离,这完全是搞混了概念,实际上后端的controller层也属于视图层,也可以归属于前端。

现在去网上一搜,问一下身边的人怎么看待前后端分离的,大多数人秉持着支持的态度,认为前后端分离好处多多,列举几条:

  • 专业的人做专业的事
  • 前后并行开发,效率高
  • 前端工程化,组件化
  • 解耦
  • 降低了开发学习难度

等等…… 大家说的都说到点上了,这也是前后端分离能发展起来的驱动力。但是道理说的都挺好,如果不结合实际情况的话就是大炮打蚊子,不但达不到理想的效果还浪费资源。而且前后端分离带来的负面情况也不可忽视:

  • 增加了沟通成本,一些前后端都可以做又都不想做的事或许只能由权利大的来决定。
  • 一般前端开发速度会比后端快,在接口没开发好时前端只能闲等着。也有反过来的情况。前后端分离也意味着任务关联性减弱,可能不是同时开发,需要一方催着一方来完成。
  • 跨域问题导致联调困难,前端只能等待接口开发上了服务器才能调试。
  • 职责分离后确认职责也困难,一个问题出现到底是谁的问题?谁解决?
  • 一个需求需要前后端开发同时参与理解需求,有理解偏差问题。
  • 小公司多一个人多一份支出。

那么到底该不该进行前后端分离,如何进行技术选型?这需要根据一些实际情况来决定,大体判断准则有以下几点:

  • 后台系统采用前后端分离比较合适。
  • 需要SEO引流的就不要强行前后端分离了,react,vue的服务端渲染也很勉强,徒增开发难度而已。
  • 数据交互比较多的使用前后端分离,操作数据比jquery方便。
  • 页面本身特别简单,只负责简单数据展示,要求打开速度,直接服务端渲染即可。这种页面本身就是单页面,如果还要使用框架就是多此一举,增加页面负担,增加开发调试难度。
  • 开发资源充足最好前后端分离,开发资源不足时不分离,一人包揽前后台端反而更快。

最后,前后端分离是一个趋势,但不是必须。更准确的说法应该叫做“前后端分工”,毕竟在5年前这些活都是一个开发来做的,因为技术复杂性提升,前端不想只是切图,后端不想学变化太快的前端就出现了分离。你可以想象测试的工作,现在的测试大多还是测业务,但是也出现了一个自动化测试的职位,因为测试不想天天鼠标点呀点的测,想搞点高深的东西,而开发又特别烦写单元测试代码,这就又出现分离。再者,数据库也是一样,所以出现了DBA这个角色。谁知哪一天又会合起来呢!