Go语言基础概念

go语言特点

  1. Go从表面看起来和C相似,基于多种语言的优点
  • 并发功能
  • 数据抽象
  • 面向对象
  • 垃圾回收
适合构建基础设施类软件(如网络服务器),以及开发的工具和系统云计算时代的C语言

go语言特性

  1. 静态类型和编译型:变量和常量在声明时指定类型,且不可改变
  2. 跨平台
  3. 自动垃圾回收
  4. 原生的并发编程:并发编程模型的组成部分
  • goroutine (Go例程)
  • channle (通道)
多编程范式:Go支持函数式编程
  • 函数类型为第一等类型
  • 面向对象编程:接口类型和实现类型、嵌入替代继承
丰富的标准库

工程结构

工作区

Go源码文件必须存放在工作区中,是一个对应于特定工程的目录

  • src目录:用于以代码包的形式组织并保存Go源码文件

  • pkg目录:存放通过go install命令安装后的代码包的归档文件(名称以 “.a” 结尾的文件)

  • bin目录:和pkg目录类似,在通过go install命令完成安装后,保存由Go命令源码生成的可执行文件

GOPATH

实际开发环境中有一个或多个工作区,这些工作区的目录路径都需要添加到GOPATH中

源码文件

  1. 命令源码文件

    源码文件声明属于main代码包,且该文件代码中包含无参数声明和结果声明的main函数,可通过go run命令直接启动运行

  2. 库源码文件

  3. 测试源码文件

代码包

gopcp.v2/helper/log/base包中的源码文件声明属于代码包:   
package "base"
   -- 包名是代码包路径的最后一个元素
-- 命令源码文件存放在哪个代码包中,都必须声明属于mian包复制代码
import (
	_"github.com/Sirupsen/logrus"
)复制代码
  • 大写:可以被本代码包之外的代码访问到
  • 小写:只能被本包内的代码访问
import "gopcp.v2/helper/log/base"复制代码
import (
	"gopcp.v2/helper/log/base"
	"gopcp.v2/helper/log/logrus"
)复制代码
import (
	"github.com/Sirupsen/logrus"
	mylogrus "gopcp.v2/helper/log/logrus"
)复制代码
import (
	."gopcp.v2/helper/log/logrus"
)复制代码

包初始化:Go中有专门的初始化函数负责代码包初始化

func init(){
	fmt.Println("Initialize...")
}复制代码

包初始化的顺序

  1. 导入包的初始化函数
  2. 当前代码包的全局变量
  3. 当前代码包的初始化函数
  4. main函数

标准命令

build

go build命令用于编译指定的源码文件或代码包以及它们的依赖包

  • 命令源码文件被编译成可执行文件,并存放到 命令执行的目录或指定目录下
  • 库文件源码不会在非临时目录中留下任何文件
clean

go clean命令用于清除因执行其他go命令遗留下来的临时目录和文件

fix

go fix命令用于修正指定代码包的源码文件中包含的过时语法和代码调用,使得升级Go语言版本时可以非常方便的同步升级程序

fmt

go fmt命令用于格式化指定代码包中的Go源码文件

get

go get命令用于下载、编译并安装指定的代码包以及其依赖包

install

go install命令用于编译并安装指定的代码包及其依赖包

list

go list命令用于显示指定代码包中的信息,进行代码包分析

run

编译并运行指定的命令源码文件,不生成可执行文件而直接运行命令源码文件

test

go test 命令用于测试指定的代码包,前提是该代码包目录中必须存在测试源码文件

tool

go tool用于运行Go语言的特殊工具

vet

go vet命令用于检查指定代码包中的Go语言源码,并报告发现可疑代码问题(除了编译以外的又一个程序检查方法)

version

显示当前安装的Go语言的版本信息以及计算环境

  • 执行标准命令时可以添加的特殊参数
  1. -a
  2. -n
  3. -race
  4. -v
  5. -work
  6. -x
  • Go语言的两个工具【Go程序调优】
  1. pprof

    分析CPU、内存、程序阻塞概要文件,并根据要求提供高可读性的输出信息

  2. trace

    读取Go程序踪迹文件,并以图形化的方式展现出来,深入了解Go程序在运行过程中的内部情况

  • 当前进程中堆的大小及使用情况
  • 程序中的多个goroutine如何调度以及某个时刻被调度的原因