如何编译armlinux的go

如何编译armlinux的go,第1张

Golang也就是Go语言,现在已经发行到141版本了,语言特性优越性和背后Google强大靠山什么的就不多说了。Golang的官方提供了多个平台上的二进制安装包,遗憾的是并非没有发布ARM平台的二进制安装包。ARM平台没办法直接从官网下载二进制安装包来安装,好在Golang是支持多平台并且开源的语言,因此可以通过直接在ARM平台上编译源代码来安装。整个过程主要包括编译工具配置、获取Golang源代码、设置Golang编译环境变量、编译、配置Golang行环境变量等步骤。

注:本文选用树莓派做测试,因为树莓派是基于ARM平台的。

1、编译工具配置

据说下个版本的golang编译工具要使用golang自己来写,但目前还是使用C编译工具的。因此,首先要配置好C编译工具:

11在Ubuntu或Debian平台上可以使用sudoapt-getinstallgcclibc6-dev命令安装,树莓派的RaspBian系统是基于Debian修改的,所以可以使用这种方法安装。

12在RedHat或CentOS6平台上可以使用sudoyuminstallgcclibc-devel命令安装。

安装完成后可以输入gcc--version命令验证是否成功安装。

2、获取golang源代码

21直接从官网下载源代码压缩包。

golang官网提供golang的源代码压缩包,可以直接下载,最新的141版本源代码链接:/golang/go141srctargz

22使用git工具获取。

golang使用git版本管理工具,也可以使用git获取golang源代码。推荐使用这个方法,因为以后可以随时获取最新的golang源代码。

221首先确认ARM平台上已经安装了git工具,可以使用git--version命令确认。一般linux平台都安装了git,没有的话可以自行安装,不同平台的安装方法可以参考:download/linux

222克隆远程golang的git仓库到本地

在终端cd到你想要安装golang的目录,确保该目录下没有名为go的目录。然后以下命令获取代码仓库:

gitclone/go

大陆地区可能会获取失败,在不**的情况下我试了几次都没成功,原因大家都懂的。好在google已经将golang也托管到github上面,所以也可以通过下面命令获取:

gitclone/golang/gogit

视网络情况,下载可能需要不少时间。我2M的带宽花了将近两个小时才下载完,虽然整个项目不过几十兆==

下载完成后,可以看到目录下多了一个go目录,里面即为golang的源代码,在终端上执行cdgo命令进入该目录。

执行下面命令检出go141版本的源代码,因为现在已经有新的代码提交上去了,最新的代码可能不是最稳定的:

gitcheckoutgo141

至此,最新141发行版的源代码获取完毕

3、设置golang的编译环境变量

主要有GOROOT、GOOS、GOARCH、GOARM四个环境变量需要设置,先解释四个环境变量的意义。

31GOROOT

主要代表golang树结构目录的路径,也就是上面git检出的go目录。一般可以不用设置这个环境变量,因为编译的时候默认会以go目录下src子目录中的allbash脚本运行时的父目录作为GOROOT的值。为了保险起见,可以直接设置为go目录的路径。

32GOOS和GOARCH

分别代表编译的目标系统和平台,可选值如下:

GOOSGOARCH

darwin386

darwinamd64

dragonfly386

dragonflyamd64

freebsd386

freebsdamd64

freebsdarm

linux386

linuxamd64

linuxarm

netbsd386

netbsdamd64

netbsdarm

openbsd386

openbsdamd64

plan9386

plan9amd64

solarisamd64

windows386

windowsamd64

需要注意的是这两个值代表的是目标系统和平台,而不是编译源代码的系统和平台。树莓派的RaspBian是linux系统,所以这些GOOS设置为linux,GOARCH设置为arm。

33GOARM

表示使用的浮点运算协处理器版本号,只对arm平台有用,可选值有5,6,7。如果是在目标平台上编译源代码,这个值可以不设置,它会自动判断需要使用哪一个版本。

总结下来,在树莓派上设置golang的编译环境变量,可编辑$HOME/bashrc文件,在末尾添加下面内容:

exportGOROOT=你的go目录路径

exportGOOS=linux

exportGOARCH=arm

编辑完后保存,执行source~/bashrc命令让修改生效。

4、编译源代码

环境变量配置完成自后就可以开始编译源代码。在go目录下的src子目录中,主要有allbash和makebash两个脚本(另外还有两个allbat和makebat脚本适用于window平台)。编译实际上就是执行其中一个脚本,两者的区别在于allbash在编译完成后还会执行一些测试套件。如果希望只编译不测试,可以运行makebash脚本。使用cd命令进入go下src目录,执行/allbash或者/makebash命令即可开始编译。由于硬件情况不同,编译耗费的时间不同。在我的B型树莓派编译过程花费了将近半个小时,编译完成后执行的测试套件又花费了差不多一个小时,总共花费了一个半小时左右。

5、配置golang运行环境变量

编译完成后,go目录下会生成bin目录,里面就是go的运行脚本。为了以后使用方法,可以将这个bin路径添加到PATH环境变量中。同样编辑~/bashrc文件,因为前面设置过GOROOT环境变量指向go目录了,所以只需要在末尾加上

exportPATH=$PATH:$GOROOT/bin

保存后同样执行source~/bashrc命令让环境变量生效。

至此,golang源代码编译安装成功。执行goversion应该就能看到当前golang的版本信息,表示编译安装成功。

tips: 号,可以指向指针类型内存地址上的值,&号,可以获取值类型的内存地址

每一个变量都有内存地址,可以通过变量来 *** 作内存地址中的值,即内存的大小

go语言中获取变量的内存地址方法:通过 & 符号可以获取变量的地址

定义:普通变量存储的是对应类型的值,这些类型就叫值类型

变量b,在内存中的地址为:0x1040a124,在这个内存地址上存储的值为:156

定义:指针类型的变量存储的是⼀个地址,所以⼜叫指针类型或引⽤类型

b 是值类型,它指向的是内存地址上的值

a是指针类型,它指向的是b的内存地址

指针类型定义,语法: var 变量名 类型

指针类型在定义完成后,默认为空地址,即空指针(nil)

在定义好指针变量后,可以通过 符号可以获取指针变量指向的变量

在这里的 a 等价于 b,通过修改 a ,最终修改的是值类型b的值

这里a,d是值类型,b,c是指针类型

d就相当于把a内存地址上值,在内存中从新开辟了一块空间存储,d和a互不影响

b,c相当于指向了a的内存地址,当使用号引用出内存地址上的变量上,修改值得,a的值也会跟着改变

Golang提供了一些GPU编程库,例如CUDA、OpenCL和OpenACC等等。这些库允许您使用Golang编写并发的GPU应用程序。下面是使用Golang调用GPU的步骤:

1 确保您已经安装了CUDA、OpenCL或OpenACC。

2 使用Golang编写相应的GPU程序,例如使用CUDA编写的程序可以使用GoCudnn库。这个库提供了一系列用于GPU深度学习的函数,并且可以在Golang中轻松调用CUDA加速的算法。另外,还有Gorgonia库,该库使用了CUDA,OpenCL和TensorFlow等库,使得Golang具有快速计算张量的能力。

3 编写能够与GPU通信的代码,例如在CUDA中,你需要将Golang数据转换为相应的CUDA数据类型。

4 将代码编译为可执行文件。

5 运行程序并使用GPU执行计算 *** 作。

请注意,GPU编程需要一定的专业知识。如果您没有GPU编程经验,可以参考一些在线学习资源来了解相关的技术。

我们知道 golang 中,slice, map, channel 是引用类型,函数之间传递都是以值拷贝的形式进行的,引用类型经过函数传递,依然是引用类型。

在上述例子中,我们从 map 中想拿出一个值,这个值是一个简单结构体,拿出这个值后,不确定这个值和 map 中的值是什么关系,如果不小心修改,是否会造成 map 值变更。

我们希望 golang 中更多的是值传递,这样能避免数据存储在堆上,造成 gc 负担。

可以看到,修改值后,map 中的值保持不变。说明 map 获取的值也是值传递出来的。

有个通过代理进来的tcp连接,通过ConnRemoteAddr获取到的是代理点的ip地址,为了获取实际客户端的ip,找到了syscallGetpeername的方法,而这个方法需要的是连接的fd。

上一章节介绍了使用echo启动一个>

以上就是关于如何编译armlinux的go全部的内容,包括:如何编译armlinux的go、golang-指针类型、golang调用gpu等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9553712.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存