• Go 编译 && 工具


    编译和工具链

    Go 的工具链非常丰富,从获取源码、编译、文档、测试、性能分析,到源码格式化、源码提示、重构工具等应有尽有

    • 在 Go 中可以使用测试框架编写单元测试,使用统一的命令行即可测试及输出测试报告的工作
    • 基准测试提供可自定义的计时器和一套基准测试算法,能方便快速地分析一段代码可能存在的 CPU 耗用和内存分配问题
    • 性能分析工具可以将程序的 CPU 耗用、内存分配、竞态问题以图形化方式展现出来

    build 命令

    Go 的编译速度非常快(并发编译),并且以 GOPATH 作为工作目录和一套完整的工程目录结构规则(GOPATH 需要提前配置好)

    使用 go build 命令将源码编译为可执行文件,有很多种编译方法,如无参数编译、文件列表编译、指定包编译等,使用这些方法都可以输出可执行文件

    准备代码目录结构

    代码目录结构(位置是 ./src/part_9_compile)

    demo:main.go 模块中 main() 函数调用了同包模块 lib.go 里面的 pkgFunc() 函数

    main.go 代码:

    package main
    import "fmt"
    
    func main(){
            //同包函数
    	pkgFunc()
    	fmt.Println("main func call")
    }

    lib.go 代码:

    package main
    import "fmt"
    
    func pkgFunc(){
    	fmt.Println("call pakFunc success")
    }
    

    无参数编译

    如果源码中没有依赖 GOPATH 的包的引用,那么这些源码可以使用无参数 go build 编译:

    go build + 文件列表

    go build + 包

    包名的路径是相对于 GOPATH 下的 src 目录开始的

    添加 -o 参数可以指定输出可执行文件的文件名,例如:

    go build -o main part_9_compile/go_build
    

    go build 编译时的附加参数

    表中的附加参数按使用频率排列,根据需要选择进行使用

    附加参数备  注
    -v 编译时显示包名
    -p n 开启并发编译,默认情况下该值为 CPU 逻辑核数
    -a 强制重新构建
    -n 打印编译时会用到的所有命令,但不真正执行
    -x 打印编译时会用到的所有命令
    -race 开启竞态检测

    go install 命令 

    go install 的功能与 go build 类似,附加参数绝大多数都可以与 go build 通用,只是将编译的中间文件放在 GOPATH 下的 pkg 目录下,以及固定地将编译结果放在 GOPATH 下的 bin 目录中

    go install 是建立在 GOPATH 上的,无法在其它的目录中使用 go install,生成的可执行文件的名称来自编译时的包名无法使用 -o 参数指定文件名

    run 命令

    Python 语言可以在不输出二进制的情况下,将代码使用解释器边编译边执行,Go 虽然不使用解释器,但可以使用 go run 命令来达到同样的效果

    go run 命令会编译源码,并且执行源码的 main() 函数,不会在当前目录生成可执行文件,工作目录为当前目录

    在 go run 的后面可以添加参数,这部分命令行参数,可以被传入到程序内部进行接收

    package main
    import (
        "flag"
        "fmt"
    )
    
    func main(){
    	// 接收命令行参数,key,默认值,帮助
    	var mode *string = flag.String("mode", "", "process mode")
    
    	var level int
        flag.IntVar(&level, "level", 0, "process level")
    
        flag.Parse()
        fmt.Println(*mode, level)
    }
    
    调用:
    go run main.go --mode="production" --level=1
    
    运行结果:
    production 1
    

      

    后续补充 ~

    每天都要遇到更好的自己.
  • 相关阅读:
    java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;
    jetty9内嵌到应用,并在启动后加载WebApplicationInitializer,可运行jsp
    Gradle Maven 依赖管理
    gradle多模块开发
    Github .gitignore详解
    Could not find or load main class org.gradle.wrapper.GradleWrapperMain解决办法
    SOC 与 ARM
    Codis集群的搭建与使用
    TIDB VS COCKROACHEB
    mysql故障
  • 原文地址:https://www.cnblogs.com/kaichenkai/p/11088883.html
Copyright © 2020-2023  润新知