生成安装包
系统执行
go build (-x 可以看到具体都执行了哪些操作)
混编
#如果我们想生成linux和windows上的程序,只要通过一下命令:
$gox -os "windows linux" -arch amd64
1.编译window 64位:
gox -osarch="windows/amd64" ./
2.编译mac 64位:
gox -osarch = "darwin/amd64" ./
3.编译Linux 64位:
gox -osarch="linux/amd64" ./
执行命令包
- linux(./main 编译后的文件可执行采集 ./main & 后台运行)
- Windows(直接运行main.exe GoModTest.exe -name 123)
注意:
现象:同一个文件夹下面有多个go文件,a.go,b.go,c.go,其中main在a.go中,直接go run a.go,报undefined 错误12
原因:go在run之前会先进行编译操作,而在此处的编译它只会以这个a.go为准,导致其他几个引用文件中的方法出现找不到的情况
(而采用go build的方式又不一样,他会自动查找引用文件并打包)123
解决办法:go run a.go b.go c.go
(重点)自定义交互命令
1.指定加载的配置文件
./main -c 指定加载的配置文件
2.例如获取版本号-v
[root@hu mq]# ./mqbeat_linux_amd64 -v
1.0.0
main.go代码如下
if util.SliceContainString(os.Args, "-v") {
fmt.Printf("%v\n", config.Version)
os.Exit(0)
}
os.Args作为数组的输出里面可以取到具体的值
E:\Workplace_Go\src\GoModTest>go run main.go -v 200
[C:\Users\Admin\AppData\Local\Temp\go-build184099962\b001\exe\main.exe -v 200]
3.获取帮助信息-h
[root@hu mq]# ./mqbeat_linux_amd64 -h
Usage of Websphere_MQbeat:
-E value
Configuration overwrite (default null)
-N Disable actual publishing for testing
-T test mode with console output
-c value
Configuration file, relative to path.config (default beat.yml)
-configtest
Test configuration and exit.
-cpuprofile string
Write cpu profile to file
-httpprof string
Start pprof http server
-memprofile string
Write memory profile to this file
-path.config value
Configuration path
-path.data value
Data path
-path.home value
Home path
-path.logs value
Logs path
-reload
reload config
-setup
Load the sample Kibana dashboards
-strict.perms
Strict permission checking on config files (default true)
-version
Print the version and exit
Informations:
Version= 1.0.0
BuildCommit=
BuildTime= 2019/06/26
GoVersion= 1.12.1
main.go代码如下
if util.SliceContainString(os.Args, "-h") {
buf := bytes.NewBufferString("Usage of " + config.AppName + ":\n")
flag.CommandLine.SetOutput(buf)
flag.PrintDefaults()
fmt.Printf("%v", buf.String())
fmt.Println("Informations:")
fmt.Printf(" Version= %v\n", config.Version)
fmt.Printf(" BuildCommit= %v\n", config.BuildCommit)
fmt.Printf(" BuildTime= %v\n", config.BuildTime)
fmt.Printf(" GoVersion= %v\n", config.GoVersion)
os.Exit(0)
}
config.go代码如下
var (
AppName = "MQbeat"
Version = "1.0.0"
)
交互方式命令行参数Flag:
在 go 标准库中提供了一个包:flag,方便进行命令行解析
1.flag.Parse()要放在main函数体的第一行
var name string
flag.StringVar(&name, "name", "everyone", "The greeting object.")
flag.Parse()
fmt.Println(name)
flag.BoolVar(&h, "h", false, "this help")
flag.BoolVar(&v, "v", false, "show version and exit")
flag.Int、flag.Bool、flag.String这样的函数格式都是一样的。
参数的说明如下:
&name:为接收到的值,具体指为name。
第一个arg表示参数名称,在控制台的时候,提供给用户使用。
第二个arg表示默认值,如果用户在控制台没有给该参数赋值的话,就会使用该默认值。
第三个arg表示使用说明和描述,在控制台中输入-arg的时候会显示该说明,类似-help。