Golang工程组织和编译

创作人 Leo


编辑时间 Sun Nov 29,2020 at 09:30


Golang工程组织和编译

工程组织:

在$GOPATH目录下有三个目录

bin:自动生成,保存 install 指令生成的二进制可执行程序

pkg:自动生成,保存非可执行程序(没有main包)的库文件

src:手动创建,保存程序源码

包:

golang 包路径为 $GOPATH/src

例如:

package test
import(
    "github.com/phpxin/gotest"
    )

对应本地路径为:$GOPATH/src/github.com/phpxin/gotest

MAIN 和 INIT

main 函数必须且只能在 package main 中声明

init 包括main在内的每个包可以有一个init函数

main 和 init 函数为go进程自动调用

命令

go build:编译软件

例:go bulid github.com/phpxin/gotest

由于 github.com/phpxin/gotest 已经$GOPATH/src 中,所以可以在任意位置执行该指令,go build 指令会自动找到该包位置

go install:编译软件,并将结果安装到合适位置,比如可执行文件移动到 $GOPATH/bin,库文件移动到 $GOPATH/pkg

例:go install github.com/phpxin/gotest

go clean:清除编译后的文件

Macos 编译注意事项:

在某系OSX系统(比如10.13),会出现执行go编译后的文件出现 “Killed: 9” ,解决方法:

go install -ldflags=“-w -s” github.com/phpxin/gotest

-ldflag

加入动态参数可以改变程序内部变量
比如我们需要在编译时加入程序版本号

package main

import "fmt"

var (
	buildVer = ""
)

// 在编译后的文件进行可执行文件连接是加入动态参数
// 参考 https://studygolang.com/articles/23900
// go build -ldflags "-X main.buildVer=1.0" .
func main() {
	fmt.Println(buildVer)
}

console

$ go build -ldflags "-X main.buildVer=1.0" .
$ ./buildtest 
1.0

参考:
golang编译时的参数传递(gcflags, ldflags)

golang 在编译时也是需要逐个编译源文件,然后在通过连接将其生成为单个可执行文件
可以把 go build 当成一个批处理工具,帮助我们编译连接
就像我们在开发 c 语言程序时,需要编写 Makefile 处理编译连接一样,go build 提供了一个规范化的程序生成工具


阅读:1320
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 2678
  • web rtc 学习笔记(一) 2591
  • react 学习笔记(一) 2490
  • Mac系统编译PHP7【20190929更新】 2388
  • zksync 和 layer2 2367
  • Hadoop Map Reduce 案例:好友推荐 2287
  • Hadoop 高可用集群搭建 (Hadoop HA) 2275
  • 小白鼠问题 2211
  • Linux 常用命令 2176
  • 安徽黄山游 2152
简介
不定期分享软件开发经验,生活经验