前言
Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。
Go语言非常适合制作系统程序或者基于网络的程序,也有大佬尝试在mcu上试用TinyGo开发单片机程序。但是在单板计算机上试用Go语言开发应用控制外设,还是比较少的。
Golang的helloworld程序
我们可以从Golang官网找到helloworld程序,程序内容很简单,如下
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
把这个文件保存到~/main.go路径
Golang程序的运行条件
虽然Golang支持多平台运行,但是也是有一定的运行限制的。其中一个重要的限制就是libc的类型:使用了glibc还是musl libc。
首先我们看一下WSL2里Ubuntu的libc,执行以下命令,可以看到libc.so.6。看到这里基本上可以确认是glibc,也可以通过运行lib的绝对路径获得glibc的版本和详细信息。
ldd /bin/ls
然后开发板上的libc如图,也是GNU C Library(简称glibc)
也有人好奇什么平台上使用的musl libc,提示会是怎样?据我所知的,Gentoo Linux和Alpine Linux都可以用musl libc,这里我们用docker运行一个alpine,并查看,如下图
下载和安装正确平台的Golang程序
既然已经搞清楚需要需要用glibc版本的golang,那我们去下载golang安装支持包的时候,是不是需要找glibc的golang安装包呢?
不需要,因为golang官网只提供了glibc版本的golang,如果需要用musl libc版本的golang,建议使用docker镜像(例如golang:1.13.1-alpine )进行编译。
所以在这里,我们只需要随便下载一个golang安装到系统里就可以了。
编译arm平台的可执行文件
交叉编译Golang程序,需要设置GOOS和GOARCH属性,然后编译程序。我们运行以下命令。
GOOS=linux GOARCH=arm go build main.go
此时可以看到成功生成了一个arm架构的可执行程序,具体信息如下
上传到开发板并运行
在开发板上执行ip addr命令,可以得到目前开发板的IP地址。然后使用scp命令将编译出来的main程序上传到开发板上,并运行main程序。结果如图:
完成本例程后的拓展思考
相对buildroot和交叉编译c语言程序来说,Golang有非常多的系统支持库和网络功能支持库,同时又可以访问Linux文件系统,那理论上使用Golang编写一些简单的外设调用程序,并配合网络组件,实现一些有趣的功能,也应该是可以实现的。
|