Go语言的交叉编译

今天帮人做了一个类似字符串分析的小程序,为了方便,就用Go语言来开发的,不过我的环境是Linux,对方的使用环境是WindowsXP32bit,就关系到了交叉编译的问题。

在Linux下,交叉编译可以这样来做:

$ cd /usr/local/go/src
$ sudo CGO_ENABLED=0 GOOS=windows GOARCH=386 ./make.bash

回车并等待执行结束后,即可对代码进行交叉编译了:

$ CGO_ENABLED=0 GOOS=windows GOARCH=386 go build your_source.go

即可得到目标平台下对应的可执行文件 your_source.exe

go build 與 go install 的區別

go build

在命令行中,使用go build加上文件名,即可在當前目錄下得到一個可執行的文件。默認這個文件的擴展名是GO_ARCH環境變量所指定系統的可執行文件擴展名。

例如,在windows系統下:

go build main.go

可在當前目錄獲得到main.exe可執行文件。

go install

與go build相比,go install不但可以生成對應系統的可執行文件,還可以將對應的文件放置到事先約定的目錄中。

  • go install編譯出的可執行文件,會放置到與src同級的bin目錄中;
  • go install編譯出的可執行文件,以其所在的目錄名命名;
  • go install編譯出可執行文件的各种依賴package,會放置到與src同級的pkg目錄中。

Go语言的并发编程

i intGo语言中原生引入了协程,可以通过channel实现协程间通信。

示例代码如下:

package main

import (
	"fmt"
)

func myFunc(c chan int, i int) {
	fmt.Printf("from myFunc %dn", i)
	c <- 1
	defer close(c)
}

func wait(c chan int) {
	hasMore := true
	for hasMore {
		if _, hasMore = <-c; hasMore {
		}
	}
}

func main() {
	c := make(chan int)
	for i := 0; i < 100; i ++ {
		go myFunc(c, i)
	}
	wait(c)
}

Golang中神奇的“:=”符号

Go语言中引入了一种C/C++中没有的符号“:=”,用于明确表达同时进行变量声明及初始化的工作。

尽管Go语言是不折不扣的强类型语言,但是通过使用该符号,可以使得Go语言可以通过表达式自动推导出右值的类型,并声明左值的变量。

val := 10		// 编译器根据右值自动推导出val的类型为int

当然,符号左值的变量不应该是已经被声明过的变量,否则会导致编译错误“no new variables on left side of :=”。

var i int
i := 2
// 此时编译器会报错“no new variables on left side of :=”