Go快速入门

一、Go语言概述

       Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点:

  • 它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序;
  • Go为软件构造提供了一种模型,它使依赖分析更加容易,且避免了大部分C风格include文件与库的开头;
  • Go是静态类型的语言,它的类型系统没有层级。因此用户不需要在定义类型之间的关系上花费时间,这样感觉起来比典型的面向对象语言更轻量级;
  • Go完全是垃圾回收型的语言,并为并发执行与通信提供了基本的支持;
  • 按照其设计,Go打算为多核机器上系统软件的构造提供一种方法;      

二、GoRoot、GoPath、GoBin

       Go是一门全新的静态类型开发语言,具有自动垃圾回收丰富的内置类型,函数多返回值错误处理匿名函数,并发编程反射等特性。go命令依赖一个重要的环境变量:$GOPATH,GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号;当有多个GOPATH时默认将go get获取的包存放在第一个目录下。

2.1 GoRoot

       其实就是golang 的安装路径。当Go语言的安装包刚下载完毕的时候,你把它解压或者直接安装到的那个目录,就是GOROOT 目录,GOROOT里面的代码都是系统驱动程序以及系统调用。此时你需要做一些额外的配置,将 GOROOT 这个环境变量设置一下,当然对应的 bin 目录你也得设置一下,否则操作系统找不到 go 的执行文件。比如你解压后安装到 /opt/go/ 目录下了,又或者在 Windows 下面你安装到了 C 盘 C:\\GO都是 OK 的,区别只是不同操作系统环境下设置的方法不同而已。

2.2 GoPath

       在安装Go的时候看到需要设置GOPATH变量,Go从1.1版本到1.7必须设置这个变量,而且不能和Go的安装目录一样,这个目录用来存放Go源码,Go的可运行文件,以及相应的编译之后的包文件。所以这个目录下面有三个子目录:src、bin、pkg。从go 1.8开始,GOPATH环境变量现在有一个默认值,如果它没有被设置。 它在Unix上默认为$HOME/go,在Windows上默认为%USERPROFILE%/go。go 命令依赖一个重要的环境变量:$GOPATH;Windows系统中环境变量的形式为%GOPATH%。GOPATH允许多个目录,当有多个目录时,请注意分隔符,多个目录的时候Windows是分号,Linux系统是冒号,当有多个GOPATH时,默认会将go get的内容放在第一个目录下。以上 $GOPATH 目录约定有三个子目录:

  • src 存放源代码(比如:.go .c .h .s等);

  • pkg 编译后生成的文件(比如:.a);

  • bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中,如果有多个gopath,那么使用${GOPATH//://bin:}/bin添加所有的bin目录);

2.3 GoBin

       go install编译存放路径。不允许设置多个路径。可以为空。为空时则遵循“约定优于配置”原则,可执行文件放在各自GOPATH目录的bin文件夹中(前提是:package main的main函数文件不能直接放到GOPATH的src下面。Go配置完成后通过命令:go env查看配置的环境是否正确,配置示例如下所示:

GOARCH="amd64"
GOBIN="/Users/Gandoph/GoWork/bin"
GOCACHE="/Users/Gandoph/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/Gandoph/GoWork"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
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 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/b0/zl92tk714t5dws59mvlwjzyw0000gn/T/go-build051831990=/tmp/go-build -gno-record-gcc-switches -fno-common"

三、目录结构与应用搭建

       GOPATH下的src目录就是接下来开发程序的主要目录,所有的源码都是放在这个目录下面,那么一般我们的做法就是一个目录一个项目,例如: $GOPATH/src/myApp表示myApp这个应用包或者可执行应用,这个根据package是main还是其他来决定,main的话就是可执行应用,其他的话就是应用包。所以当新建应用或者一个代码包时都是在src目录下新建一个文件夹,文件夹名称一般是代码包名称,当然也允许多级目录,例如在src下面新建了目录$GOPATH/src/github.com/astaxie/beedb 那么这个包路径就是"github.com/astaxie/beedb",包名称是最后一个目录beedb。

  • 执行编写应用包sqrt的shell脚本
$ cd $GOPATH/src
$ mkdir sqrt
$ cd sqrt
$ vim sqrt.go
  • 编写sqrt.go文件,文件内容如下所示
package sqrt
func Sqrt(x float64) float64 {
    z := 0.0
    for i := 0; i < 1000; i++ {
        z -= (z*z - x) / (2 * x)
    }
    return z
}
  • 编译应用文件sqrt.go

  1. 只要进入对应的应用包目录sqrt,然后执行go install,就可以安装了;
  2. 在任意的目录执行如下代码go install sqrt;
  • 安装完之后,我们可以进入pkg目录查看编译的应用包sqrt.a
cd $GOPATH/pkg/${GOOS}_${GOARCH}
  • 新建应用程序myApp调用应用包sqrt.a
cd $GOPATH/src
mkdir myApp
cd myApp
vim main.go
  • 编写main.go文件,文件内容如下所示
package main
import (
    "sqrt"  //导入应用包sqrt
    "fmt"
)
func main() {
    fmt.Printf("Hello, world.  Sqrt(2) = %v\n", mymath.Sqrt(2))
}

        可以看到这个的package是main,import里面调用的包是sqrt,这个就是相对于$GOPATH/src的路径,如果是多级目录,就在import里面引入多级目录,如果你有多个GOPATH,也是一样,Go会自动在多个$GOPATH/src中寻找。如何编译程序呢?进入该应用目录myApp,然后执行go build,那么在该目录下面会生成一个myApp的可执行文件。用命令./myApp运行可执行程序输出如下内容:

Hello, world.  Sqrt(2) = 1.414213562373095

四、go get

        go语言有一个获取远程包的工具就是go get(main.go所在的目录下),目前go get支持多数开源社区(例如:GitHub、googlecode、bitbucket、Launchpad)

go get github.com/astaxie/beedb

go get -u 参数可以自动更新包,而且当go get的时候会自动获取该包依赖的其他第三方包

       通过这个命令可以获取相应的源码,对应的开源平台采用不同的源码控制工具,例如GitHub采用git、googlecode采用hg,所以要想获取这些源码,必须先安装相应的源码控制工具。 go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行go install(main.go所在的目录下)。在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以:

import "github.com/astaxie/beedb"

五、程序的整体结构

bin/
    myApp
pkg/
    darwin_amd64 c//平台名如:darwin_amd64、linux_amd64
        sqrt.a
        github.com/
            astaxie/
                beedb.a
src/
    myApp
        main.go
    sqrt/
        sqrt.go
    github.com/
        astaxie/
            beedb/
                beedb.go
                util.go
                util_test.go
                README.md
                example/
                    asta.db
                    gomysql.go
                    mssql.go
                    mysql.go
                    pg.go
                    sqlite.go

六、为什么项目要放在GOPATH/src目录下?

       因为GO的包搜索是从GOPATH和GOROOT路径下搜索,源码必须要放在GOROOT或GOPATH的src目录下才能找到。但把源码和包放在一起,对于很多人来说确实不太很习惯,有一种做法通过在GOPATH中设置两个路径,go get下载的包默认放在GOPATH设置的第一个路径下,源码src放在GOPATH的第二个路径下。比如GOPATH 设置如下,如此就可以把工作区设在 /usr/software/Work/go/src,而安装包放在 /usr/software/go/src:

export GOPATH=/usr/software/go/:/usr/software/Work/go

七、GoBin环境配置时同时导出GoRoot和GoPath的区别?

        goroot/bin环境变量指明了go语言可执行脚本的位置;gopath/bin则指明了go项目编译生成可执行脚本的位置。使用命令:

vim ~/.bash_profile 添加Mac Go语言环境变量配置如下所示,使用命令:source ~/.bash_profile使环境变量生效

       Go快速入门_第1张图片

你可能感兴趣的:(Go,GoPath,GoRoot,GoRoot,GoPath,GoBin,Go)