• Golang Go Go Go part1:安装及运行


    golang 知识图谱

    https://www.processon.com/view/link/5a9ba4c8e4b0a9d22eb3bdf0

    一、安装

    最新版本安装包地址:https://golang.google.cn/dl/

    要自己编译安装下载 source 源码包,否则根据自己 LINUX 系统下载对应版本的编译包,这里直接下载  go1.11.4.darwin-amd64.tar.gz

    把下载的 golang 包解压到 /opt 下面:  

    sudo tar -C /opt/ -xzf go1.11.4.linux-amd64.tar.gz

    解压完 golang 语言包存在 /opt/go 下, 使用命令查看go程序路径 , 显示 go 程序的路径是 /opt/go/bin/go

      whereis go

    查看 go 版本: 

      /opt/go/bin/go version

    如果需要在 终端内直接 输入 go 就能全局地使用 go 程序, 还需要配置系统环境变量。

    在 /etc/profile 文件后面加入配置:

    export GOROOT=/opt/go
    export GOPATH=/home/ecalf/goProject
    export GOBIN=$GOPATH/bin
    export PATH=$PATH:$GOBIN:$GOROOT/bin

    或者建立下面软件接

    sudo ln -s /opt/go/bin/go /usr/bin/go
    sudo ln -s /opt/go/bin/go /usr/local/bin/go

    这些配置方法跟 node 的配置类似,有开发过 node 的经验应该会很熟悉。 

    查看 go 相关环境变量

    go env

    输出

    GOARCH="amd64"
    GOBIN="/home/ecalf/goProject/bin"
    GOCACHE="/home/ecalf/.cache/go-build"
    GOEXE=""
    GOFLAGS=""
    GOHOSTARCH="amd64"
    GOHOSTOS="linux"
    GOOS="linux"
    GOPATH="/home/ecalf/goProject"
    GOPROXY=""
    GORACE=""
    GOROOT="/opt/go"
    GOTMPDIR=""
    GOTOOLDIR="/opt/go/pkg/tool/linux_amd64"
    GCCGO="/usr/bin/gccgo"
    CC="gcc"
    CXX="g++"
    CGO_ENABLED="1"
    GOMOD=""
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build111443368=/tmp/go-build -gno-record-gcc-switches"

    GOROOT 是 go 所在目录,go 命令在 GOROOT/bin 内;

    GOPATH 是 go 的工作目录,可以指定多个文件夹。

    $GOPATH 目录约定有三个子目录:

    1. src 存放源代码(比如:.go .c .h .s等)
    2. pkg 编译后生成的文件(比如:.a)
    3. bin 编译后生成的可执行文件(为了方便,把此目录加入到 $PATH 变量中)

    所有开发的 go 代码都要放在 GOPATH/src 指定的目录下,go get 等命令获取的代码包也会自动放置在这些目录下。

    环境变量配置好后,查看go版本只要在命令行输入

    go version

    关于程序文件编码: Go语言的源文件采用UTF8编码。

    二、hello world

    在 $GOPATH/src 下创建项目文件夹 hello,在 项目文件夹下面编辑文件:  hello.go 

      
    package main
    import "fmt"
    
    /*first go program */
    //hello world
    func main() { //go 程序的新行不能以 { 开始
       fmt.Println("Hello, World!")
    }
    

    进入$GOPATH/src/hello 目录  

    使用 go run 命令直接在终端执行,查看运行结果:

    go run ./hello.go

     使用 go build 命令把 go 程序编译为可执行文件

    go build ./hello.go
    

     

    使用 go install 命令编译并生成可执行文件

    go install hello

    命令执行后,在 $GOPATH/bin 下生成了可以行文件  hello

    在终端执行生成的程序

    ./hello

    下面是几个关于运行和编译的命令:

    go run: 编译并直接运行程序,产生一个临时文件,直接在命令行输出程序执行结果但不生成可执行文件,多用于程序的简单调试。当执行的文件引用了包内其他文件的方法时,必须指定编译用到的所有文件,这个时候可以使用通配符来指定编译所有文件   go run *.go 。   该命令执行的文件可以放在任何目录内,只要正确指定要编译的文件路劲即可,但这些文件必须是同一个 main 包内的。

    go build:测试编译包,主要检查是否会有编译错误,如果是一个可执行文件的源码(即是 main 包,go 的程序入口是 main 函数),就会在当前目录下直接生成一个可执行文件。

    go install:该命令有2个作用,1.编译程序,先编译所有导入的包文件,然后才会编译主程序;2.将编译生成的可执行文件放到 $GOPATH/bin 目录下,编译后的包文件放到 $GOPATH/pkg 目录下。

    其他 go 命令文档可查阅下面官方文档

    https://golang.google.cn/cmd/

    三、golang 的 package 概念

    GO本身没有项目的概念,只有包,go 通过package来组织结构,每个 go 代码文件的第一行非注释代码都必须使用 package 命令来声明代码所属的包名,同一个目录中(不含子目录)的所有代码文件只能属于同一个包,即一个文件夹就是一个包。

    go 的包分两种:可执行包(命令包,有main函数,编译后放在$GOPATH/bin内)和不可执行包(只供调用,没有main函数,编译后放在$GOPATH/pkg内),包开发源代码都放在 $GOPATH/src 目录下,GO命令和编译器会在 $GOROOT/src 和 $GOPATH/src 目录下搜索相应的包。

    因为导入包的时候要通过包文件的目录,而使用包提供的方法则需要通过包名,为了方便包定位,供调用的pkg包应该保持包名和目录名称一致,有main函数的可执行包的包名必须是main,可以使用程序名称作为包的文件夹名称。

    可执行包的 main 函数:

    •  main 函数是go程序的入口, main 函数必须放在 package 名称为 main 的包内。
    • 一个可执行程序有且只有一个main函数,同一个包内不能出现两个main函数,否则 go build 命令和 go install 命令将报错。

    包的初始化:

    • 一个包如果依赖另一个包,依赖包会被先导入和初始化。
    • 包 可以定义 0个或多个 init 函数,包的 init 函数将在包被导入初始化后先于 main 函数自动执行。
    • init 函数不需要传入参数,也不会返回任何值,不能被主动调用(如果被注定调用会提示init未声明),重复导入包只会执行一次 init 函数,init 函数可以调用其他函数。
    • 如果一个包有多个init函数,他们的执行顺序是不确定的。

    包的导入:

    • 如果导入了一个包但没有使用它,编译时将报错。
    • 如果你引用包只是为了调用 init 函数去做一些初始化工作,但不打算使用包,可以将导入包重命名为 _  (空标识符,也就是下划线)来避免报错。
    • 当导入第三方包时,包名很可能非常接近或相同,需要使用别名来进行区别和调用。
    • 如果导入的包被重命名为 . (点号),使用包的的方法时可以省略包名,但一般不建议这样做。
    • 包的可见性:定义的常量、变量、类型、接口、结构、函数等的名称如果是小写字母或下划线开头,表示是只能在包内使用(有点像 protected),同一个包内,不同的文件之间可以自由调用各文件定义的常量、变量、函数,如果是大写字母开头则表示可以在包外被访问(有点像 public)。

    导入 xxx/yyy 包并重名别名

    import _ "xxx/yyy"
    

      

    包的执行顺序: 依赖包常量、变量、函数 初始化,赋值 -> 依赖包 init函数 -> 包的初始化 ,赋值 -> 包的init函数 -> main 函数

    一个简单的测试

    src/bin/hello 包内有两个文件:

    hello.go

    package main
    import "fmt"
    import cat "../cat"
    
    
    
    func main() {
    	fmt.Println("main function")
       fmt.Println("Hello, World!")
       sayHi();
       wei();
       cat.SayHello();//调用cat包的方法
    
    }
    
    func sayHi(){
    	fmt.Println("say hi")
    }
    
    func init(){
        fmt.Println("init in hello")
    }
    

        

    wei.go

    package main
    import "fmt"
    
    
    func init(){
        fmt.Println("init in wei")
    }
    
    func wei(){
        fmt.Println("wei...")
    }
    

     

    src/bin/cat  包内有一个文件 cat.go :

    package cat
    import "fmt"
    
    
    func init(){
        fmt.Println("init in cat")
    }
    
    func miao(){
        fmt.Println("miao miao ...")
    }
    
    func SayHello(){
    	miao()
    }
    

      

      

    进入 src/hello 下调试:  

    go run *.go

    编译生成可执行文件

    go install *.go

    执行结果

    init in cat
    init in hello
    init in wei
    main function
    Hello, World!
    say hi
    wei...
    miao miao ...

      

    to be continued

  • 相关阅读:
    with 上下文协议
    __del__
    描述符使用
    理解并发(Concurrency)和并行(Parallelism)
    理解ThreadLocal
    理解死锁的概念(实例)
    遇到的几种设计模式的应用
    面试题02
    操作 mysql练习14-16题
    mysql练习11-13题
  • 原文地址:https://www.cnblogs.com/ecalf/p/10118749.html
Copyright © 2020-2023  润新知