1.Go语言环境搭建及基础知识linux
Go语言官方网站(http://golang.org)
代码包文档网站(http://godoc.org)
Go语言中文网(http://studygolang.com)git
Go语言开发包下载路径:
https://golang.google.cn/dl/github
《Go并发编程实战》所用到的源码实例下载路径:
https://github.com/hyper-carrot/goc2pgolang
《Go并发编程实战》完整PDF下载路径,我放到网盘了: 编程
连接:http://pan.baidu.com/s/1pLSJ2Tt 密码:k8gjwindows
1.1 go语言配置环境变量架构
windows下:
: GOROOT={你的Go语言的根目录}
在环境变量PATH后追加;%GOROOT%\bin并发
linux下:
: Go语言官方建议把go文件夹复制到/usr/local目录中,但也能够复制到其余目录;编辑/etc/profile文件,以下:
export GOROOT=/usr/local/go
export PATH=\$PATH:\$GOROOT/bin
保存/etc/profile文件,使用source /etc/profile使配置生效。
(具体linux配置环境变量能够Google,Baidu,这里不赘述了)ide
注意: 路径链接符windows下是"\",linux下是 "/"函数
Go语言还有两个隐含的环境变量----GOOS和GORACH
: GOOS表明程序构建环境的目标操做系统,其值能够是liunx,windows,freebsd,darwin;
GORACH表明程序构建环境的目标计算架构,其值能够是386,amd64或arm;
以后提到的平台相关目录是经过\${GOOS}_\${GORACH}的方式来命名的。
(如Go归档文件的存放路径就是根据“平台相关目录”来指定的)
设置好环境变量后,在命令行中输入go出现以下信息,表示成功。
Go is a tool for managing Go source code. Usage: go command [arguments] The commands are: build compile packages and dependencies clean remove object files doc show documentation for package or symbol env print Go environment information fix run go tool fix on packages fmt run gofmt on package sources generate generate Go files by processing source get download and install packages and dependencies install compile and install packages and dependencies list list packages run compile and run Go program test test packages tool run specified go tool version print Go version vet run go tool vet on packages Use "go help [command]" for more information about a command. Additional help topics: c calling between Go and C buildmode description of build modes filetype file types gopath GOPATH environment variable environment environment variables importpath import path syntax packages description of package lists testflag description of testing flags testfunc description of testing functions Use "go help [topic]" for more information about that topic.
1.2 工做区
Go代码必须放在工做区中,工做区其实就是一个对应于特定工程的目录,它包含3个子目录src目录,pkg目录和bin目录。
src目录
: 用于以代码包的形式组织并保存Go源码文件。这里的代码包,与src下的子目录一一对应。例如,若一个源码文件被声明为属于代码包logging,那么它就应当被保存在src目录下名为logging的子目录中。固然,咱们也能够把Go源码文件直接放于src目录下,但这样的Go源码文件就只能被声明为属于main代码包了。除非用于临时测试或演示,通常仍是建议把Go源码文件放入特定的代码包中。
pkg目录
: 用于存放经由go install命令构建安装后的代码包(包含Go库源码文件)的"*.a"归档文件。该目录与GOROOT目录下的pkg功能相似,区别在于,工做区中的pkg目录专门用来存放用户代码的归档文件。构建和安装用户源码的过程通常会以代码包为单位进行,好比logging包被编译安装后,将生成一个名为logging.a的归档文件,并存放在当前工做区的pkg目录下的平台相关目录中。
bin目录
: 与pkg目录相似,在经过go install命令完成安装后,保存由Go命令源码文件生成的可执行文件。在Linux操做系统下,这个可执行文件通常是一个与源码文件同名的文件。在Windows操做系统下,这个可执行文件的名称是源码文件名称加.exe后缀。
1.3 GOPATH
工做区的目录路径须要添加到环境变量GOPATH中。不然,即便处于同一个工做区(事实上,未被加入到环境变量GOPATH中的目录不该该称做工做区),代码之间也没法经过绝对代码包路径完成调用。在实际开发中,工做区每每有多个,这些工做区的目录路径都须要添加至GOPATH中。
如Linux下有两个工做区:
~/Go/lib
~/Go/goc2p
修改/etc/profile文件,添加环境变量GOPATH的内容:
export GOPATH=\$HOME/Go/lib:\$HOME/Go/goc2p
保存/etc/profile文件,并用source命令使配置生效。
注意:
- GOPATH中不要包含环境变量GOROOT的值(即Go的安装目录路径),将Go语言自己的工做区和用户的工做区严格地分开;
- 经过Go工具中的代码获取命令go get,能够将指定项目的源码下载到咱们在环境变量GOPATH中设定的第一个工做区中,并在其中完成构建和安装的过程。
Windows下直接在系统变量中添加GOPATH环境变量便可,其中值为你的工做区的根目录。
1.4 源码文件
Go语言的源码文件分为3类:Go库源码文件,Go命令源码文件和Go测试源码文件。
命令源码文件
声明为属于main代码包,而且包含无参数声明和结果声明的main函数的源码文件。这类文件能够独立运行(使用go run命令),也能够被go build或go install命令转换为可执行文件。
同一个代码包中的全部源码文件,其所属代码包的名称必须一致。若是命令源码文件和库源码文件处于同一代码包中,该包就没法正确执行go build和go install命令。换句话说,这些源码文件也就没法被编译和安装。所以,命令源码文件一般会单独放在一个代码包中。通常状况下,一个程序模块或软件的启动入口只有一个。
同一个代码包中能够有多个命令源码文件,可经过go run命令分别运行它们。但经过go build和go install命令没法编译和安装该代码包。因此通常状况下,不建议把多个命令源码文件放在同一个代码包中。
当代码包中有且仅有一个命令源码文件时,在文件所在目录中执行go build命令,便可在该目录下生成一个与目录同名的可执行文件;若使用go install命令,则可在当前工做区的bin目录下生成相应的可执行文件。
库源码文件
存在于某个代码包中的普通源码文件。一般,库源码文件声明的包名会与它实际所属的代码包(目录)名一致,且库源码文件中不包含无参数声明和无结果声明的main函数。如在basic/set目录下执行go install命令,成功地安装了basic/set包,并生成一个名为set.a的归档文件。归档文件的存放目录由如下规则产生:
- 安装库源码文件时所生成的归档文件会被存放到当前工做区的pkg目录中。
- 根据被编译的目标计算机架构,归档文件会被放置在pkg目录下的平台相关目录中。如上的set.a在个人64位window系统上就是pkg\windows_amd64目录中。
- 存放归档文件的目录的相对路径与被安装的代码包的上一级代码包的相对路径是一致的。第一个相对路径就是相对于工做区的pkg目录下的平台相关目录而言的,而第二个相对路径是相对于工做区的src目录而言的。若是被安装的代码包没有上一级代码包(也就是说它的父目录就是工做的src目录),那么它的归档文件就会被直接存放到当前工做区的pkg目录的平台相关目录下。如basic包的归档文件basic.a总会被直接存放到pkg\windows_amd64目录下,而basic/set包的归档文件set.a则会被存放到pkg\ windows_amd64\basic目录下。
测试源码文件
这是一种特殊的库文件,能够经过执行go test命令运行当前代码包下的全部测试源码文件。成为测试源码文件的充分条件有两个:
- 文件名须要以”_test.go”结尾
- 文件中须要至少包含该一个名称为”Test”开头或”Benchmark”开头,拥有一个类型为”testing.T”或”testing.B”的参数的函数。类型”testing.T”或”testing.B”分别对应功能测试和基础测试所需的结构体。
当在某个代码包中执行go test命令,该代码包中的全部测试源码文件就会被找到并运行。
注意:存储Go代码的文本文件须要以UTF-8编码存储。若是源码文件中出现了非UTF-8编码的字符,则在运行、编译或安装时,Go会抛出“illegal UTF-8 sequence”的错误。
1.5 代码包
Go语言中的代码包是对代码进行构建和打包的基本单元。
包声明
在Go语言中,代码包中的源码文件名能够是任意的;这些任意名称的源码文件都必须以包声明语句做为文件中代码的第一行。好比src目录下的代码包basic/set包中的全部源码文件都要先声明本身属于basic/set包:
package set
package是Go语言中用于包声明语句的关键字。Go语言规定包声明中的包名为代码包路径的最后一个元素。如上,basic/set包的包路径为basic/set,而包声明中的包名则为set。除了命令源码文件不论存放在哪一个包中,都必须声明为属于main包。
包导入
代码包的导入使用代码包导入路径。代码包导入路径就是代码包在工做区的src目录下的相对路径,好比basic的绝对路径为E:\Go\goc2p\src\basic\set,而E:\Go\goc2p是被包含在环境变量GOPATH中的工做区目录路径,则其代码包导入路径就是basic/set。
import basic/set
当导入多个代码包时,须要用圆括号括起它们,且每一个代码包名独占一行。在调用被导入代码包中的函数或使用其中的结构体、变量或常量时,须要使用包路径的最后一个元素加”.”的方式指定代码所在的包。
若是咱们有两个包logging和go_lib/logging,而且有相同的方法NewSimpleLogger(),且有一个源码文件须要导入这两个包:
import ( "logging" "go_lib/logging" )
则这句代码logging.NewSimpleLogger()就会引发冲突,Go语言没法知道logging. 表明的是哪个包。因此,在Go语言中,若是在同一个源码文件中导入多个代码包,那么代码包路径的最后一个元素不能够重复。
若是用这段代码包导入代码,在编译代码时,Go语言会抛出”logging redeclared as imported package name”的错误。若是确实须要导入,当有这类重复时,咱们能够给它们起个别名来区别:
import ( la "logging" lb "go_lib/logging" )
调用包中的代码:
var logger la.Logger = la.NewSimpleLogger()
这里没必要给每一个引发冲突的代码包都起一个别名,只要可以区分它们就能够了。
若是咱们想直接调用某个依赖包的程序,就能够用”.”来代替别名。
import ( . "logging" lb "go_lib/logging" )
在当前源码文件中,能够直接进行代码调用了:
var logger Logger = NewSimpleLogger()
Go语言把变量、常量、函数、结构体和接口统称为程序实体,而把它们的名字统称为标识符。标识符能够是任何Unicode编码能够表示的字母字符、数字以及下划线”_”,而且,首字母不能是数字或下划线。
标识符的首字母的大小写控制着对应程序实体的访问权限。若是标识符的首字母是大写的,那么它对应的程序实体就能够被本代码包以外的代码访问到,也能够称其为可导出的。不然对应的程序实体就只能被本包内的代码访问。固然,还须要有如下两个额外条件:
- 程序实体必须是非局部的。局部程序实体是被定义在函数或结构体的内部。
- 代码包所在的目录必须被包含在环境变量GOPATH中的工做区目录中。
若是代码包logging中有一个叫作getSimpleLogger的函数,那么光从这个函数的名字上咱们就能够看出,这个函数是不能被包外代码调用的。
若是咱们只想初始化某个代码包而不须要再当前源码文件中使用那个代码包中的任何代码,既能够用”_”来代替别名
import ( _ “logging” )
包初始化
在Go语言中,能够有专门的函数负责代码包初始化。这个函数须要无参数声明和结果声明,且名称必须为init,以下:
func init() { println("Initialize") }
Go语言会在程序真正执行前对整个程序的依赖进行分析,并初始化相关的代码包。也就是说,全部的代码包初始化函数都会在main函数(命令源码文件中的入口函数)以前执行完成,并且只会执行一次。而且,当前代码包中的全部全局变量的初始化都会在代码包初始化函数执行前完成。这就避免了在代码包初始化函数对某个变量进行赋值以后又被该变量声明中赋予的值覆盖掉的问题。
这里举出《Go并发编程实战》中的例子,帮助理解上面的包初始化,以下:
package main // 命令源码文件必须在这里声明本身属于main包 import ( // 引入了代码包fmt和runtime "fmt" "runtime" ) func init() { // 包初始化函数 fmt.Printf("Map: %v\n", m) // 先格式化再打印 // 经过调用runtime包的代码获取当前机器所运行的操做系统以及计算架构 // 然后经过fmt包的Sprintf方法进行字符串格式化并赋值给变量info info = fmt.Sprintf("OS: %s, Arch: %s", runtime.GOOS, runtime.GOARCH) } // 非局部变量,map类型,且已初始化 var m map[int]string = map[int]string{1: "A", 2: "B", 3: "C"} var info string // 非局部变量,string类型,未被初始化 func main() { // 命令源码文件必须有的入口函数 fmt.Println(info) // 打印变量info }
命名源码文件名为initpkg_demo.go,并保存到工做区的basic/pkginit包中。以下图为我本机运行的结果:
在同一个代码包中,能够存在多个代码包初始化函数,甚至代码包内的每个源码文件均可以定义多个代码包初始化函数。Go语言编译器不能保证同一个代码包中的多个代码包初始化函数的执行顺序。若是要求按特定顺序执行的话,能够考虑使用Channel(Go语言并发编程模型的一员)进行控制。
Go语言承认两个特殊的代码包名称----all 和 std. all表明了环境变量GOPATH中包含的全部工做区中的全部代码包,而std则表明了Go语言标准库中的全部代码包。
标准命令概述
- build 编译给定的代码包或Go语言源码文件及其依赖包
- clean 清除执行其余go命令后遗留的目录和文件
- doc 执行godoc命令以打印指定代码包。
- env 打印Go语言环境信息
- fix 执行go tool fix命令以修正给定代码包的源码文件中包含的过期语法和代码调用
- fmt 执行gofmt命令以格式化戈丁代码包中的源码文件。
- generate generate Go files by processing source
- get 下载和安装给定的代码包及其依赖包
- install 编译和安装给定的代码包及其依赖包
- list 显示给定代码包的信息
- run 编译并运行给定的命令源码文件
- test 测试给定的代码包
- tool 运行Go语言的特殊工具
- version 显示当前安装的Go语言的版本信息
- vet run go tool vet on packages
在执行上述命令的时候能够经过附加一些额外的标记来定制命令的执行过程,这些标记能够看作是命令的特殊参数,这些特殊参数能够添加到命令名称和命令的真正参数中间,以下:
- -a 强行从新构建全部涉及的Go语言代码包(包括Go语言标准库中的代码包),即便它们已是最新的了。
- -n 使命令仅打印在执行期间使用到的全部命令,而不真正执行它们。
- -v 打印出命令执行过程当中涉及的Go语言代码包的名字。这些代码包通常包括咱们本身给定的目标代码包,有时候还会包括该代码包直接或间接依赖的代码包。
- -work 打印出命令执行时生成和使用的临时工做目录的名字,且命令执行完成后不对它进行删除。
- -x 打印出命令执行期间使用到的全部命令。
经常使用的Go语言的特殊工具,以下:
- fix 能够把给定代码包的全部Go语言源码文件中的旧版本代码修改成新版本。它是咱们升级Go语言版本后会使用到的工具。
- vet 用于检查Go语言源码中静态错误的简单工具。可使用它检测一些常见的Go语言代码编写错误。
- pprof 用于以交互的方式访问一些性能概要文件。命令将会分析给定的概要文件,并根据要求提供高可读性的输出信息。这个工具能够分析的概要文件包括CPU概要文件、内存概要文件和程序阻塞概要文件。这些内含Go语言运行时信息的概要文件能够经过标准库代码包runtime和runtime/pprof中的程序来生成。
- cgo 用于帮助Go语言代码使用C语言代码库,以及使用Go语言代码能够被C语言代码引用。
最后附上《Go并发编程实战》做者郝林托管到GitHub的Go命令教程,里面涉及了Go命令和工具的详细用法:
https://github.com/hyper-carrot/go_command_tutorialGo语言学习的第一天,之后持续更新。。。