Golang基础-初接触

1.Robert Griesemer: 参与开发 Java HotSpot 虚拟机

2.Rob Pike: Go 语言项目总负责人,贝尔实验室 Unix 团队成员

3.Ken Thompson:贝尔实验室 Unix 团队成员,C语言创始人之一

4.Russ Cox:加入开发团队后着手语言和类库方面的开发,也就是 Go 语言的标准包

发展

特点

1.快速编译

2.高效执行

3.易于开发

特性

1.多态性:通过接口(interface)实现

2.静态类型:类型安全

3.支持交叉编译

4.完全支持UTF-8的编程语言

特性缺失

1.不支持函数重载和操作符重载

2.不支持隐式转换(让所有的东西都显式)

3.通过另一种途径实现面向对象设计来放弃类和类型的继承

4.尽管在接口的使用方面可以实现类似变体类型的功能,但本身不支持变体类型

5.不支持动态加载代码

6.不支持动态链接库

7.不支持泛型

8.通过 recover 和 panic 来替代异常机制

9.不支持静态变量

Golang的安装(Linux)与运行环境

适用操作系统

1.Linux

2.FreeBSD

3.Mac OS X

编译器

1.原生编译器 gc

1.1 如果使用一个有不同指令集的编译器来构建 Go 程序,就需要针对操作系统和处理器架构(32 位操作系统或 64 位操作系统)进行区别对待

1.2 使用非分代、无压缩和并行的方式进行编译,它的编译速度要比 gccgo 更快,产生更好的本地代码,但编译后的程序不能够使用 gcc 进行链接

1.3 标记(Flags) 是指可以通过命令行设置可选参数来影响编译器或链接器的构建过程或得到一个特殊的目标结果

1.3.1 -I 针对包的目录搜索

1.3.2 -d 打印声明信息

1.3.3 -e 不限制错误打印的个数

1.3.4 -f 打印栈结构

1.3.5 -h 发生错误时进入恐慌(panic)状态

1.3.6 -o 指定输出文件名

1.3.7 -S 打印产生的汇编代码

1.3.8 -V 打印编译器版本

1.3.9 -u 禁止使用 unsafe 包中的代码

1.3.10 -w 打印归类后的语法解析树

1.3.11 -x 打印 lex tokens

2.非原生编译器 gccgo

一款相对于 gc 而言更加传统的编译器,使用 GCC 作为后端。GCC 是一款非常流行的 GNU 编译器,它能够构建基于众多处理器架构的应用程序。编译速度相对 gc 较慢,但产生的本地代码运行要稍微快一点。它同时也提供一些与 C 语言之间的互操作性

文件扩展名与包

1. 扩展名 .go

2. C 文件使用后缀名 .c,汇编文件使用后缀名 .s。所有的源代码文件都是通过包(packages)来组织。包含可执行代码的包文件在被压缩后使用扩展名 .a

3. Go 语言的标准库(第 9.1 节)包文件在被安装后就是使用这种格式的文件。

4. 注意 当你在创建目录时,文件夹名称永远不应该包含空格,而应该使用下划线 “_” 或者其它一般符号代替

环境变量

1. $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go,当然,你也可以安装在别的地方。

2. $GOARCH 表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm。

3. $GOOS 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。

4. $GOBIN 表示编译器和链接器的安装位置,默认是 $GOROOT/bin,如果你使用的是 Go 1.0.3 及以后的版本,一般情况下你可以将它的值设置为空,Go 将会使用前面提到的默认值。

5. $GOPATH 默认采用和 $GOROOT 一样的值,但从 Go 1.1 版本开始,你必须修改为其它路径。

5.1 bin(可执行文件)

5.2 pkg(包文件)

5.3 src(源码文件)

6. $GOARM 专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。

7. $GOMAXPROCS 用于设置应用程序可使用的处理器个数与核数。

在Linux上安装Golang

1. 设置 Go 环境变量

1.1 我们在 Linux 系统下一般通过文件 $HOME/.bashrc 配置自定义环境变量,根据不同的发行版也可能是文件 $HOME/.profile,然后使用 gedit 或 vi 来编辑文件内容:

export GOROOT=$HOME/go
复制代码

1.2 为了确保相关文件在文件系统的任何地方都能被调用,你还需要添加以下内容:

export PATH=$PATH:$GOROOT/bin
复制代码

1.3 在开发 Go 项目时,你还需要一个环境变量来保存你的工作目录。

export GOPATH=$HOME/Applications/Go
复制代码

1.4.在完成这些设置后,你需要在终端输入指令:

source .bashrc
复制代码

以使这些环境变量生效。然后重启终端,输入 go env 和 env 来检查环境变量是否设置正确。

2. 安装C工具

2.1 Go 的工具链是用 C 语言编写的,因此在安装 Go 之前你需要先安装相关的 C 工具。如果你使用的是 Ubuntu 的话,你可以在终端输入以下指令( 译者注:由于网络环境的特殊性,你可能需要将每个工具分开安装 )。

sudo apt-get install bison ed gawk gcc libc6-dev make
复制代码

3.获取 Go 源代码

3.1 从https://golang.org/dl/ 上下载 Go 的源码包到你的计算机上,然后将解压后的目录 go 通过命令移动到 $GOROOT 所指向的位置

wget https://storage.googleapis.com/golang/go.src.tar.gz
tar -zxvf go.src.tar.gz
sudo mv go $GOROOT
复制代码

4. 构建 Go

4.1 在终端使用以下指令来进行编译工作

cd $GOROOT/src
./all.bash
复制代码

4.2 在完成编译之后(通常在 1 分钟以内,如果你在 B 型树莓派上编译,一般需要 1 个小时),你会在终端看到如下信息被打印:

安装目录清单

README.md,作者,贡献者,许可
/bin:包含阳离子文件,如:编译器,Go工具
/doc:包含示例程序,代码工具,本地文档等
/lib:包含文档模版
/misc:包含与支持Go编辑器有关的配置文件以及cgo的示例
/os_arch:包含标准库的包的对象文件(.a)
/src:包含源代码编写脚本和标准库的包的完整源代码(Go是一门开源语言)
/src/cmd:包含Go和C的编译器和命令行脚本
复制代码

Golang调试

1. 在合适的位置使用打印语句输出相关变量的值(print/println 和 fmt.Print/fmt.Println/fmt.Printf)。

2. 在 fmt.Printf 中使用下面的说明符来打印有关变量的相关信息

2.1 %+v 打印包括字段在内的实例的完整信息

2.2 %#v 打印包括字段和限定类型名称在内的实例的完整信息

2.3 %T 打印某个类型的完整说明

3. 使用 panic 语句来获取栈跟踪信息(直到 panic 时所有被调用函数的列表)。

4. 使用关键字 defer 来跟踪代码执行过程。

构建并运行

Go 程序,从 Go 1 版本开始,使用 Go 自带的更加方便的工具来构建应用程序:

go build 编译自身包和依赖包

go install 编译并安装自身包和依赖包

Golang格式化代码

1. gofmt –w program.go 会格式化该源文件的代码然后将格式化后的代码覆盖原始内容(如果不加参数 -w 则只会打印格式化后的结果而不重写文件)

2. gofmt -w *.go 会格式化并重写所有 Go 源文件

3. gofmt map1 会格式化并重写 map1 目录及其子目录下的所有 Go 源文件

4. gofmt 也可以通过在参数 -r 后面加入用双引号括起来的替换规则实现代码的简单重构,规则的格式: ->

4.1 例1: gofmt -r ‘(a) -> a’ –w *.go

4.2例2: gofmt -r ‘a[n:len(a)] -> a[n:]’ –w *.go

4.3 例3: gofmt –r ‘A.Func1(a,b) -> A.Func2(b,a)’ –w *.go

生成代码文档

1. go doc package获取包的文档注释,例如:go doc fmt会显示使用godoc生成的fmt包的文档注释。

2. go doc package/subpackage获取子包的文档注释,例如:go doc container/list。

3. go doc package function获取某个函数在某个包中的文档注释,例如:go doc fmt Printf会显示有关fmt.Printf()的使用说明。

其它工具

1. go install 是安装Go包的工具,类似Ruby中的rubygems。主要用于安装非标准库的包文件,将源代码编译成对象文件。

2. go fix用于将您的Go代码从旧的发行版迁移到最新的发行版,它主要负责简单的,重复的,枯燥无味的修改工作,如果像API等复杂的函数修改,工具可以引用文件名和代码。Go开发团队一般也使用这个工具升级Go内置工具以及谷歌内部项目的代码。go fix之所以能够正常工作是因为Go在标准库就提供生成抽象语法树。该工具会尝试更新当前目录下的所有Go源文件,并在完成代码更新后在控制台输出相关的文件名。

3. go test 是一个轻量级的单元测试框架。