使用Go编译为可执行文件(windows/linux)

案例场景:创建一个两层目录,并在该目录下创建一个文件,将“Hello World”字符写入该文件,并读取出来。

目标:(1)测试案例是否能执行成功;(2)编译代码成windows与linux两种环境下的可执行文件。

测试代码文件名为main.go,内容如下:

package main
 
import (
	"fmt"
	"io/ioutil"
	"os"
)
 
func main() {
	// 文件夹名
	_dir := "data/test"
	exist, err := pathExists(_dir)
	if err != nil {
		fmt.Printf("get dir error![%v]\n", err)
		return
	}
 
	if exist {
		fmt.Printf("has dir![%v]\n", _dir)
	} else {
		fmt.Printf("no dir![%v]\n", _dir)
		// 创建文件夹
		//err := os.Mkdir(_dir, os.ModePerm)
		err := os.MkdirAll(_dir, 0666)
		if err != nil {
			fmt.Printf("mkdir failed![%v]\n", err)
		} else {
			fmt.Printf("mkdir success!\n")
			fileName := _dir + "/test.txt"
			// 创建文件
			os.Create(fileName)
			// 打开文件
			file, _ := os.OpenFile(fileName, os.O_WRONLY|os.O_APPEND, 0666)
			// 当执行完,关闭文件
			defer file.Close()
			// 写内容到文件中
			file.WriteString("Hello World!")
			//读取文件
			data, _ := ioutil.ReadFile(fileName)
			// 打印内容
			fmt.Println(string(data))
		}
	}
}
 
func pathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

经过调试,上述代码可正常执行。测试通过。

编译成windows环境exe可执行文件过程,打开文件所在目录,在资源路径框中输入cmd,打开cmd命令框,通过“go env”查看当期环境变量,以windows10环境为例,默认为windows环境。

// 配置环境变量
SET CGO_ENABLED=1
SET GOOS=windows
SET GOARCH=amd64
// 编译命令
go build main.go

编译出来后就是一个可执行文件main.exe,可用鼠标双击直接执行,传到其他电脑上操作,依然可执行,不依赖第三方包(不像Java会依赖JDK)。

执行后,在main.exe所在目录下,生成一个data/test/test.txt,并且打开test.txt文件可看到Hello World。

编译成Linux环境可执行文件,此处除编译环境参数外,其他步骤与上面类似,编译参数如下

// 配置参数
SET CGO_ENABLED=0 
SET GOOS=linux 
SET GOARCH=amd64 
// 编译命令
go build main.go

编译输出的可执行文件名为main,上传至centos7.x系统,使用 “chmod +x main”添加可执行权限,执行 ” ./main “,输出结果与上述windows结果一样。

备注:上述编译环境所在的操作系统均为Windows10,即在windows10上开发代码,编译输出windows与linux两种环境的可执行文件。