主页

索引

模块索引

搜索页面

3.2.2. go build命令

usage:

$ go build [-o output] [-i] [build flags] [packages]
$ go help build

实例:

$ go build      // 默认packages为当前目录
$ go build flysnow.org/tools

// 3个点表示匹配所有字符串,这样go build就会编译tools目录下的所有包
$ go build flysnow.org/tools/...

GOOS&GOARCH

示例:

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

GOOS:

- aix
- android
- darwin
- dragonfly
- freebsd
- hurd
- illumos
- js
- linux
- nacl
- netbsd
- openbsd
- plan9
- solaris
- windows
- zos

GOARCH:

- 386
- amd64
- amd64p32
- arm
- armbe
- arm64
- arm64be
- ppc64
- ppc64le
- mips
- mipsle
- mips64
- mips64le
- mips64p32
- mips64p32le
- ppc
- riscv
- riscv64
- s390
- s390x
- sparc
- sparc64
- wasm

选项gcflags

观察逃逸分析的结果:

$ go build -gcflags="-m" main.go

-N -l的标记是忽略编译器优化的意思,这样我们就可以更容易的调试程序:

$ go build -gcflags "-N -l" main.go

选项ldflags

格式:

-ldflags '[pattern=]arg list'

说明:

arguments to pass on each go tool link invocation.

app/config/vars.go:

package config

var Version string

var BuildTime string

main.go:

package main

import (
    "fmt"
    "app/config"
)

func main() {
    fmt.Println("build.Version:\t", Version)
    fmt.Println("build.Time:\t", build.BuildTime)
}

build:

$ go build -ldflags "-X 'app/config.Version=0.0.1' -X 'app/config.BuildTime=$(date)'" main.go

run:

$ ./app
Version:     0.0.1
build.Time:  Sat Jul  4 19:49:19 UTC 2020

更多实例: 参见

备注

-w: turns off DWARF debugging information: you will not be able to use gdb on the binary to look at specific functions or set breakpoints or get stack traces, because all the metadata gdb needs will not be included.

备注

-s: turns off generation of the Go symbol table: you will not be able to use ‘go tool nm’ to list the symbols in the binary. Strip -s is like passing -s to -ldflags but it doesn’t strip quite as much.

更多详情: 参见

跨平台编译

查看编译环境:

➜  ~ go env
GOARCH="amd64"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
// 注意里面两个重要的环境变量GOOS和GOARCH

编译链工具:

// 可以让我们在任何一个开发平台上,编译出其他平台的可执行文件
GOOS=linux GOARCH=amd64 go build flysnow.org/hello

共享资源竞争检测

使用:

$ go build -race

实例``cat main.go``:

var (
    count int32
    wg    sync.WaitGroup
)

func main() {
    wg.Add(2)
    go incCount()
    go incCount()
    wg.Wait()
    fmt.Println(count)
}

func incCount() {
    defer wg.Done()
    for i := 0; i < 2; i++ {
        value := count
        runtime.Gosched()
        value++
        count = value
    }
}

检测:

$ go build -race
$ ls
main.go concurrency
$ ./concurrency
==================
WARNING: DATA RACE
Read at 0x0000012282b8 by goroutine 8:
  main.incCount()
      /Users/zhaoweiguo/9tool/go/src/github.com/zhaoweiguo/demo-go/pkg/basic3/concurrency/demo1.go:34 +0x79

Previous write at 0x0000012282b8 by goroutine 7:
  main.incCount()
      /Users/zhaoweiguo/9tool/go/src/github.com/zhaoweiguo/demo-go/pkg/basic3/concurrency/demo1.go:37 +0x98

Goroutine 8 (running) created at:
  main.main()
      /Users/zhaoweiguo/9tool/go/src/github.com/zhaoweiguo/demo-go/pkg/basic3/concurrency/demo1.go:26 +0x77

Goroutine 7 (finished) created at:
  main.main()
      /Users/zhaoweiguo/9tool/go/src/github.com/zhaoweiguo/demo-go/pkg/basic3/concurrency/demo1.go:25 +0x5f
==================
4
Found 1 data race(s)

主页

索引

模块索引

搜索页面