golang生成动态链接库

使用下面命令来编译:

windows

# go build -buildmode=c-shared -o libhello.dll .\libhello.go

linux / mac

# go build -buildmode=c-shared -o libhello.so ./libhello.go

Access-Control-Allow-Origin与跨域

在使用NSB进行转发Ajax请求时,当出现跨域问题,可以在NSB的响应header中添加:

Access-Control-Allow-Origin: http://blog.ixcv.com

来实现接口的跨域请求。

设置为*则可以允许任意来源进行Ajax请求(当然,生产环境中没有这么玩儿的):

Access-Control-Allow-Origin: *

 

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 :=”

Go语言中获取用户控制台输入

使用fmt包的Scanf方法可以获取用户的控制台输入:

import "fmt"
func main() {
	var str string
	fmt.Printf("请输入内容:")
	fmt.Scanf("%s", &str)
	fmt.Printf("输入了:%s", str)
}

Go语言解析.ini配置文件

在Github上找到的Go语言读取.ini配置文件的包,实用派。

https://github.com/polaris1119/goconfig

基本用法:

// 加载配置文件
c, _ := config.ReadDefault("config.cfg")

// 字符串值
c.String("service-1", "url")

// 整型值
c.Int("service-1", "maxclients")

// 布尔值
c.Bool("service-1", "delegation")