go语言简述
0. 簡述
Go是一個開源的編程語言,它能讓構造簡單、可靠且高效的軟件變得容易。
Go語言被設計成一門應用于搭建web服務器,存儲集群或類似用途的巨型中央服務器的系統編程語言。對于高性能分布式系統領域而言,Go語言無疑比大多數其他語言有著更高的開發效率。它提供了海量并行的支持,這對于游戲服務器端的開發而言是再好不過的。
Go官網:https://golang.google.cn/或https://github.com/golang/go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
X86上編譯運行:
wang@ubuntu:~/go$ go build -o hello hello.go wang@ubuntu:~/go$ ./hello Hello, World!
或直接運行
wang@ubuntu:~/go$ go run hello.go Hello, World!
X86平臺交叉編譯ARM64平臺上程序:
GOOS=linux GOARCH=arm64 go build -o hello hello.go wang@ubuntu:~/go$ file hello hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, not stripped
godoc用法:
godoc -http=localhost:6060 -play
godoc可提供離線的go文檔,便于本地查看。
可在https://godoc.org/中搜索所有golang庫的接口說明。
1. Go編譯器
兩種官方編譯器,gc和gccgo,其中gccgo基于gcc后端。
go編譯器支持8種指令集,不同建構編譯質量不同:
amd64 (also known as x86-64) 386 (x86 or x86-32) Comparable to the amd64 port. arm (ARM) Supports Linux, FreeBSD, NetBSD, OpenBSD and Darwin binaries. Less widely used than the other ports. arm64 (AArch64) Supports Linux and Darwin binaries. New in 1.5 and not as well exercised as other ports. ppc64, ppc64le (64-bit PowerPC big- and little-endian) Supports Linux binaries. New in 1.5 and not as well exercised as other ports. mips, mipsle (32-bit MIPS big- and little-endian) Supports Linux binaries. New in 1.8 and not as well exercised as other ports. mips64, mips64le (64-bit MIPS big- and little-endian) Supports Linux binaries. New in 1.6 and not as well exercised as other ports. s390x (IBM System z) Supports Linux binaries. New in 1.7 and not as well exercised as other ports.
go編譯環境可以被定制,與平臺和建構相關的是$GOOS和$GOARCH,分別指定目標操作系統和目標建構。常用組合如下:(注:$GOOS是darwin for macOS 10.1及以上和iOS)
$GOOS $GOARCH android arm darwin 386 darwin amd64 darwin arm darwin arm64 linux 386 linux amd64 linux arm linux arm64 windows 386 windows amd64
go編譯器(或go環境)安裝
有兩種安裝方式:二進制發布包和源碼包,參考https://golang.google.cn/doc/install。一般情況下可直接下載二進制發布包,官方已提供了常用平臺的二進制發布包。
下載二進制tar包,tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz,一般安裝路徑為/usr/local,go工具命令要執行需要將/usr/local/go/bin導出到PATH環境變量中(/etc/profile可長期有效)。
源碼包安裝方式參考:Installing Go from source
ubuntu下可直接apt安裝:
sudo apt-get install golang-go
go工具卸載
linux下直接刪除/usr/local/go目錄即可(同時修改PATH環境變量,或/etc/profile)。
GO環境變量
go env可打印go環境變量。
$GOPATH
GOPATH指定workspace位置,默認為$home/go,go項目在本地的開發環境的項目根路徑(以便項目編譯,go build, go install,go get)。若工作在其他目錄,需設定GOPATH。export GOPATH=$HOME/go
或直接寫到/etc/profile中,然后source /etc/profile
注意GOPATH不能和go安裝目錄相同。
go env GOPATH
打印當前有效的GOPATH,若沒有設置打印默認位置。
For convenience, add the workspace'sbinsubdirectory to yourPATH:
$ export PATH=$PATH:$(go env GOPATH)/bin
GOPATH之下主要包含三個目錄:bin,pkg,src。bin目錄主要存放可執行文件;pkg目錄存放編譯好的庫文件,主要是*.a文件;src目錄下主要存放go的源文件。
$GOROOT
go的安裝目錄,配置后不會更改。一般為/usr/local/go或/usr/go或/usr/lib/go。
$GOROOT_FINAL
$GOOS and $GOARCH
用于不同平臺的交叉編譯,只需要在build之前設置這兩個變量即可,這也是go語言的優勢之一:可以編譯生成跨平臺運行的可執行文件。
注意:這個交叉編譯暫不支持cgo方式,因此交叉編譯時需要設置$CGO_ENABLED設置為0。
$GOHOSTOS and $GOHOSTARCH
$GOBIN
go二進制文件安裝目錄,默認為$GOROOT/bin。
$GO386
$GOARM
$GOMIPS
集成開發環境IDE
vscode-golang配置參考:VS code golang 開發環境搭建
2. cgo
Cgo lets Go packages call C code.
The basics
If a Go source file imports"C", it is using cgo. The Go file will have access to anything appearing in the comment immediately preceding the lineimport "C", and will be linked against all other cgo comments in other Go files, and all C files included in the build process.
Note that there must be no blank lines in between the cgo comment and the import statement.
To access a symbol originating from the C side, use the package nameC. That is, if you want to call the C functionprintf()from Go code, you writeC.printf(). Since variable argument methods like printf aren't supported yet (issue975), we will wrap it in the C method "myprint":
package main
/*
#include <stdio.h>
#include <stdlib.h>
void myprint(char* s) {
printf("%s", s);
}
*/
import "C"
import "unsafe"
func main() {
cs := C.CString("Hello from stdio
")
C.myprint(cs)
C.free(unsafe.Pointer(cs))
}
參考:
1. http://golang.org/doc/articles/c_go_cgo.html
2.https://github.com/golang/go/wiki/cgo
3.http://wiki.jikexueyuan.com/project/go-command-tutorial/0.13.html 極客學院go命令詳解
4. https://books.studygolang.com/advanced-go-programming-book/ch2-cgo/readme.htmlGo語言高級編程(Advanced Go Programming)cgo編程
3. Go交叉編譯
參考:Go cross compilation
If cgo is not required (common go programs, not including c/c++)
The go tool won’t require any bootstrapping if cgo is not required. That allows you to target the following program to any GOOS/GOARCH without requiring you to do any additional work. Invokego build.
$ cat main.go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
In order to target android/arm, run the following command.
$ GOOS=android GOARCH=arm GOARM=7 go build .
The produced binary is targeting ARMv7 processors that runs Android. All possible GOOS and GOARCH values are listed on theenvironment docs.
If cgo is required (including c/c++)
If you need to have cgo enabled, the go tool allows you to provide custom C and C++ compilers via CC and CXX environment variables.
$ CGO_ENABLED=1 CC=android-armeabi-gcc CXX=android-armeabi-g++
GOOS=android GOARCH=arm GOARM=7 go build .
The toolchain will invoke android-armeabi-gcc and android-armeabi-g++ if it is required to compile any part of the package with a C or C++ compiler. Consider the following program with a slightly different main function. Rather than outputting “hello world” to the standard I/O, it will use Android system libraries to write “hello world” to the system log.
$ cat main.go
// +build android
package main
// #cgo LDFLAGS: -llog
//
// #include <android/log.h>
//
// void hello() {
// __android_log_print(
// ANDROID_LOG_INFO, "MyProgram", "hello world");
// }
import "C"
func main() {
C.hello()
}
If you build the program with the command above and examine the build with -x, you can observe that cgo is delegating the C compilation to arm-linux-androideabi-gcc.
$ CGO_ENABLED=1 CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ GOOS=android GOARCH=arm GOARM=7 go build -x . ... CGO_LDFLAGS=”-g” “-O2” “-llog” /Users/jbd/go/pkg/tool/darwin_amd64/cgo -objdir $WORK/github.com/rakyll/hello/_obj/ -importpath github.com/rakyll/hello — -I $WORK/github.com/rakyll/hello/_obj/ main.go arm-linux-androideabi-gcc -I . -fPIC -marm -pthread -fmessage-length=0 -print-libgcc-file-name arm-linux-androideabi-gcc -I . -fPIC -marm -pthread -fmessage-length=0 -I $WORK/github.com/rakyll/hello/_obj/ -g -O2 -o $WORK/github.com/rakyll/hello/_obj/_cgo_main.o -c $WORK/github.com/rakyll/hello/_obj/_cgo_main.c ...
Pre-building the standard library
The go tool also provides a utility if you would like to pre-build the standard library, targeting a specific GOOS and GOARCH.
$ CGO_ENABLED=1
CC=arm-linux-androideabi-gcc
CXX=arm-linux-androideabi-g++
GOOS=android GOARCH=arm GOARM=7 go install std
The standard library targeting android/armv7 will be available at $GOROOT/pkg/android_arm.
$ ls $GOROOT/pkg/android_arm archive fmt.a math runtime.a bufio.a go math.a sort.a bytes.a hash mime strconv.a compress hash.a mime.a strings.a container html net sync crypto html.a net.a sync.a crypto.a image os syscall.a database image.a os.a testing debug index path testing.a encoding internal path.a text encoding.a io reflect.a time.a errors.a io.a regexp unicode expvar.a log regexp.a unicode.a flag.a log.a runtime
If you prefer not to pre-build and install the standard library to the GOROOT, required libraries will be built while building user packages. But,the standard libraries builds are not preserved for future use at this stage and they will be rebuilt each time you rungo build.
go語言學習參考:
1.Go 系列教程(Golang tutorial series) go語言中文網
2. go入門指南博客
3. go語言學習博客
4.go基礎學習 coder python修行路
5.beego項目https://beego.me
6.https://github.com/golang/go
7.How to write Go Codehttps://golang.google.cn/doc/code.html
8.https://golang.google.cn/提供go在線測試環境和文檔
9.https://golang.google.cn/doc/go相關文檔
10.https://golang.google.cn/pkg/go標準庫
11.https://godoc.org/ go實用庫搜索
12.https://books.studygolang.com/advanced-go-programming-book/ch2-cgo/readme.htmlGo語言高級編程(Advanced Go Programming)
13.在 GitHub 上構建一個看上去正規的 Golang 項目
14.Go 語言設計與實現
總結
- 上一篇: 操作系统的发展史(科普章节)
- 下一篇: win7下发布网站