简介
Go 是一门开放源码的编译型编程语言,可容易的构建简单、可靠和高效的软件
历史
Go 语言是由谷歌的开发工程师(罗伯特·格瑞史莫、罗勃·派克、肯·汤普逊等)于 2007 年开始设计,利用 20%的自由时间开发的实验项目,并于 2009 年以 BSD-style 授权(完全开源)首次公开发布,于 2012 年正式发布。
创造
开发者使用编程语言的三大分类(执行速度、简易程度、开发难度):
执行速度快、编译速度慢(编译型):C,C++
执行速度较慢、编译速度快(解释型): JAVA,.NET
执行速度慢、开发难度小(动态脚本):Python,PHP
Go 语言在 3 个条件做了平衡:易于开发、快速编译、高效执行
特性
Go 语言被称为 21 世纪的 C 语言,Go 从其他开发语言的借鉴了许多优秀的设计思想,例如从C 语言借鉴表达式、流程控制、基础数据类型、参数传递、指针等,从 Oberon-2 语言借鉴的包的导入和声明等,从 Oberon 语言借鉴的面向对象特性中方法的声明语法,从Limbo 语言中借鉴的 CSP(通信顺序进程, communicating sequential processes),从 APL 语言借鉴的 iota 语法,从 Scheme 语言借鉴的作用域和嵌套函数……
⚫ 静态类型并具有丰富的内置类型: bool、byte、rune、int、float、string、array、slice、map
⚫ 函数多返回值
⚫ 错误处理机制:使用 defer、panic、recover 定义标准的错误流程
⚫ 语言层并发:使用关键字go将函数以Goroutine方式运行,使用CSP模型作为Goroutine的通信方式
⚫ 面向对象:使用类型、组合、接口来实现面向对象思想
⚫ 反射
⚫ CGO:用于调用 C 语言实现的模块
⚫ 自动垃圾回收
⚫ 静态编译
⚫ 交叉编译
⚫ 易于部署
⚫ 基于 BSD 协议完全开放
应用
Go 语言主要用于服务端开发,其定位是开发大型软件,常用于:
⚫ 服务器编程:日志处理、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等
⚫ 网络编程:Web 应用、API 应用、下载应用
⚫ 内存数据库
⚫ 云平台
⚫ 机器学习
⚫ 区块链
⚫ ……
使用 Go 开发的项目列表:https://github.com/golang/go/wiki/Projects
⚫ Go
⚫ docker
⚫ kubernetes
⚫ lantern
⚫ etcd
⚫ Prometheus
⚫ Influxdb
⚫ Consul
⚫ nsq
⚫ beego
⚫ ……
使用 Go 开发的组织:http://go-lang.cat-v.org/organizations-using-go
⚫ 国外:Google、CloudFlare……
⚫ 国内:阿里、腾讯、百度、京东、爱奇艺、小米、今日头条、滴滴、美团、饿了么、360、七牛、B 站、盛大、搜狗……
环境准备
安装
Golang程序下载地址:
https://golang.google.cn/dl/
具体安装步骤省略
比如go1.14.9.windows-amd64.msi安装成功后
配置一下国内代理,这里选用七牛云的
go env -w GOPROXY=https://goproxy.cn,direct
GOPROXY配置国内代理后,即可下载相关插件
验证
命令行窗口
go env 命令验证
第一个程序
helloWorld.go
package main // 声明包名main
//Go 源文件开头必须使用 package 声明代码所属包,包是 Go 代码分发的最基本单位。若程序需要运行包名必须为 main。
import "fmt" //导入fmt包
//import 用于导入程序依赖的所有的包
func main() { //func 用于定义函数。main 函数是程序的入口,若程序需要运行必须声明 main 函数,main函数无参数也无返回值
fmt.Println("Hello World") //调用fmt包的Prinln控制台打印Hello World字符串
}
运行程序
go build helloWorld.go //用于编译&链接程序或包
helloWorld.exe //执行编译后的可执行程序
Go基本命令
常用参数:
-x: 打印编译过程执行的命令,并完成编译或运行
-n: 只打印编译过程执行命令,不编译
-work:打印编译过程的临时目录
-o: 指定编译结果文件
go build: 用于编译&链接程序或包
go build -work -x -o helloworld.exe main.go
go run:先编译再运行程序
go run -work -x main.go
go clean:清除编译文件
基础语法
标识符
标识符是编程时所使用的名字,用于给变量、常量、函数、类型、接口、包名等进行命名,以建立名称和使用之间的关系,Go 语言标识符的命名规则:
只能由非空字母(Unicode)、数字、下划线(_)组成
只能以字母或下划线开头
不能 Go 语言关键字
避免使用 Go 语言预定义标识符
建议使用驼峰式
标识符区分大小写
Go 语言提供一些预先定义的标识符用来表示内置的常量、类型、函数,在自定义标识符时应避免使用:
内置常量:true、false、nil、iota
内置类型:bool、byte、rune、int、int8、int16、int32、int64、uint、uint8、unit16、unit32、unit64、uintptr、float32、float64、complex64、complex128、string、error
内置函数:make、len、cap、new、append、copy、close、delete、complex、real、imag、panic、recover
空白标识符:_
Go 语言定义 25 关键字:
声明:import、package
实体声明和定义:chan、const、func、interface、map、struct、type、var
流程控制:break、case、continue、default、defer、else、fallthrough、for、go、goto、if、range、return、select、switch
字面量
字面量是值的表示方法,常用与对变量/常量进行初始化,主要分为:
标识基础数据类型值的字面量,例如:0, 1.1, true, 3 + 4i, 'a', "我爱中国"
构造自定义的复合数据类型的类型字面量,例如:type Interval int
用于表示符合数据类型值的复合字面量,用来构造 array、slice、map、struct 的值,例如:{1, 2, 3}
分割符
小括号()
中括号[]
大括号()
分号;
逗号,
声明
声明变量的 var
声明常量的 const
声明函数的 func
声明类型的 type
问题追踪和调试
Go语言所提供的是尽量简单的语法和尽量完善的库,以尽可能降低问题的发生概率。当然,问题还是会发生的,这时需要用到问题追踪和调试技能。这里我们简单介绍下最常规的问题跟踪方法之一:打印日志
打印日志
package main
import "fmt"
func main() {
fval := 110.48
ival := 200
sval := "This is a string. "
fmt.Println("The value of fval is", fval)
fmt.Printf("fval=%f, ival=%d, sval=%s
", fval, ival, sval)
fmt.Printf("fval=%v, ival=%v, sval=%v
", fval, ival, sval)
}
//结果
The value of fval is 100.48
fval=100.48, ival=200, sval=This is a string.
fval=100.48, ival=200, sval=This is a string.
fmt.Printf打印:
%T 数据类型
%v 自动调用对应的数据类型格式打印
%#v 是值的Go语法表示
fmt包的这一系列格式化打印函数使用起来非常方便,但在正式开始用Go开发服务器系统时,我们就不能只依赖fmt包了,而是需要设计严格的日志规范。Go语言的log包提供了基础的日志功能。如果有需要,你也可以引入自己的log模块。
记:Print和Println也可以了解一下
如何寻求帮助
Go语言已经发展了几年时间,凭借着语言本身的优越品质和Google的强大号召力,在推出正式版本之前就已经拥有了广大的爱好者和社区,本节就介绍一些不错的Go语言社区。在遇到问题时,请随时访问这些社区,并勇敢地提问,相信你能得到满意的解决方法。