如意飞歌 發表於 2019-6-26 11:25:00

Go 编译 && 工具

<h2><span style="color: rgba(255, 102, 0, 1)">编译和工具链</span></h2>
<p>Go 的工具链非常丰富,从获取源码、编译、文档、测试、性能分析,到源码格式化、源码提示、重构工具等应有尽有</p>
<ul>
<li>在 Go 中可以使用测试框架编写单元测试,使用统一的命令行即可测试及输出测试报告的工作</li>
<li>基准测试提供可自定义的计时器和一套基准测试算法,能方便快速地分析一段代码可能存在的 CPU 耗用和内存分配问题</li>
<li>性能分析工具可以将程序的 CPU 耗用、内存分配、竞态问题以图形化方式展现出来</li>
</ul>
<p>&nbsp;</p>
<h2><span style="color: rgba(255, 102, 0, 1)">build 命令</span></h2>
<p>Go 的编译速度非常快(并发编译),并且以 GOPATH 作为工作目录和一套完整的工程目录结构规则(GOPATH 需要提前配置好)</p>
<p>使用 go build 命令将源码编译为可执行文件,有很多种编译方法,如无参数编译、文件列表编译、指定包编译等,使用这些方法都可以输出可执行文件</p>
<p>&nbsp;</p>
<p><strong>准备代码目录结构</strong></p>
<p>代码目录结构(位置是 ./src/part_9_compile)</p>
<p>demo:main.go 模块中 main() 函数调用了同包模块 lib.go 里面的 pkgFunc() 函数</p>
<p><img src="https://img2018.cnblogs.com/blog/1629331/201906/1629331-20190626104343376-596050565.png" alt=""></p>
<p>&nbsp;</p>
<p>main.go 代码:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">package main
import "fmt"

func main(){
      //同包函数
        pkgFunc()
        fmt.Println("main func call")
}</pre>
</div>
<p>&nbsp;</p>
<p>lib.go 代码:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">package main
import "fmt"

func pkgFunc(){
        fmt.Println("call pakFunc success")
}
</pre>
</div>
<p>&nbsp;</p>
<p><strong>无参数编译</strong></p>
<p>如果源码中没有依赖 GOPATH 的包的引用,那么这些源码可以使用无参数 go build 编译:</p>
<p><img src="https://img2018.cnblogs.com/blog/1629331/201906/1629331-20190626105925320-564732580.png" alt=""></p>
<p>&nbsp;</p>
<p><strong>go build + 文件列表</strong></p>
<p><strong><img src="https://img2018.cnblogs.com/blog/1629331/201906/1629331-20190626110644956-1989138746.png" alt=""></strong></p>
<p>&nbsp;</p>
<p><strong>go build + 包</strong></p>
<p>包名的路径是相对于 GOPATH 下的 src 目录开始的</p>
<p><img src="https://img2018.cnblogs.com/blog/1629331/201906/1629331-20190626112056727-349757055.png" alt=""></p>
<p>&nbsp;</p>
<p>添加 -o 参数可以指定输出可执行文件的文件名,例如:</p>
<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">go build <span style="background-color: rgba(255, 153, 0, 1)">-o main</span> part_9_compile/go_build
</pre>
</div>
<p>&nbsp;</p>
<p><strong>go build 编译时的附加参数</strong></p>
<p>表中的附加参数按使用频率排列,根据需要选择进行使用</p>
<table>
<tbody>
<tr><th>附加参数</th><th>备 &nbsp;注</th></tr>
<tr>
<td>-v</td>
<td>编译时显示包名</td>
</tr>
<tr>
<td>-p n</td>
<td>开启并发编译,默认情况下该值为 CPU 逻辑核数</td>
</tr>
<tr>
<td>-a</td>
<td>强制重新构建</td>
</tr>
<tr>
<td>-n</td>
<td>打印编译时会用到的所有命令,但不真正执行</td>
</tr>
<tr>
<td>-x</td>
<td>打印编译时会用到的所有命令</td>
</tr>
<tr>
<td>-race</td>
<td>开启竞态检测</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2><span style="color: rgba(255, 102, 0, 1)">go install 命令</span>&nbsp;</h2>
<p>go install 的功能与 go build 类似,附加参数绝大多数都可以与 go build 通用,只是<span style="background-color: rgba(255, 153, 0, 1)">将编译的中间文件放在 GOPATH 下的 pkg 目录下,以及固定地将编译结果放在 GOPATH 下的 bin 目录中</span></p>
<p>go install 是建立在 GOPATH 上的,无法在其它的目录中使用 go install,<span style="background-color: rgba(255, 153, 0, 1)">生成的可执行文件的名称来自编译时的包名</span>,<span style="background-color: rgba(255, 153, 0, 1)">无法</span>使用 -o 参数指定文件名</p>
<p>&nbsp;</p>
<h2><span style="color: rgba(255, 102, 0, 1)"><strong>run 命令</strong></span></h2>
<p>Python 语言可以在不输出二进制的情况下,将代码使用解释器边编译边执行,Go 虽然不使用解释器,但可以使用 go run 命令来达到同样的效果</p>
<p>go run 命令会编译源码,并且执行源码的 main() 函数,不会在当前目录生成可执行文件,工作目录为当前目录</p>
<p>&nbsp;</p>
<p>在 go run 的后面可以添加参数,这部分命令行参数,可以被传入到程序内部进行接收</p>
<div class="cnblogs_Highlighter">
<pre class="brush:go;gutter:true;">package main
import (
    "flag"
    "fmt"
)

func main(){
        // 接收命令行参数,key,默认值,帮助
        var mode *string = flag.String("mode", "", "process mode")

        var level int
    flag.IntVar(&amp;level, "level", 0, "process level")

    flag.Parse()
    fmt.Println(*mode, level)
}

调用:
go run main.go --mode="production" --level=1

运行结果:
production 1
</pre>
</div>
<p>  </p>
<p>后续补充 ~</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    每天都要遇到更好的自己.<br><br>
来源:https://www.cnblogs.com/kaichenkai/p/11088883.html
頁: [1]
查看完整版本: Go 编译 && 工具