Go 语言入门指南:基础语法和常用特性解析
一.什么是Go语言
Go语言(也称为Golang)是由Google开发的一种开源编程语言。它于2009年首次发布,旨在提高编程效率,特别是在处理高并发和大规模系统时,能有效提升系统处理响应请求的效率。
Go语言主要具有如下特点: 其中最出名的正是其并发的特性,在Go语言中我们开启并发有多容易呢?
js
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("主goroutine启动")
go subRoutine() // 启动一个新的goroutine
time.Sleep(time.Second) // 主goroutine等待一秒
fmt.Println("主goroutine结束")
}
func subRoutine() {
fmt.Println("子goroutine启动")
time.Sleep(2 * time.Second)
fmt.Println("子goroutine结束")
}
goroutine是Go语言中的轻量级线程。你只需在函数调用前加上go关键字,就可以启动一个新的goroutine。
二.Go语言环境配置
既然Go有这样的特点,那么我们该如何使用Go语言呢?首先我们得进入到官方网站(The Go Programming Language),官方网站如下图所示,我们点击Download按钮。 之后可以跳转到如下图所示的资源下载页面,此处有两种下载方式(installer和archive),使用installer方式安装和你平时使用软件安装包一样,只需点击选项即可;而采用archive方式,我们需要下载并解压压缩包,并为其配置环境变量,推荐尝试archive安装方式。此外下载的版本一定要和自己使用的系统相匹配 ,不然会发生错误。 我们选择下载zip文件(Linux则是tar.gz,一定要和自己使用的系统相匹配 ),之后我们还需要为其配置环境变量。
一个是 GOROOT ,这个就是 Go 环境所在目录的配置。
另一个是 GOPATH ,这个是 Go 项目的工作目录,你以后开发的代码就写在这个文件夹中。
- GOROOT - go语言的安装路径
- GOPATH - go语言依赖存放路径
GOPATH和GOROOT的配置略有不同,可以配置两个GOPATH目录,第一个用于放 Go 语言的第三方包,第二个用于放自己的开发代码。 之后我们需要将新建的GOROOT添加到 Path 这个环境变量中(%GOROOT%\bin)。 最后在cmd命令行或powershell中执行go version命令,最后能正常显示版本就说明安装正确。
js
#查看Go版本
go version
#查看Go环境变量
go env
此外我们还需要配置GOPROXY,Go默认的GOPROXY的值是:GOPROXY=proxy.golang.org,direct 而我们打开这个网站就会发现 因此,我们需要将其替换为国内镜像网站,比如改为:goproxy.io,direct (七牛镜像)或 mirrors.aliyun.com/goproxy (阿里云镜像)
我们需要在cmd命令行或powershell中执行如下指令
js
#开启mod模式(项目管理需要用到)
go env -w GO111MODULE=on
#重新设置成七牛镜像源或阿里镜像源(用原有的会比较慢)
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy
#关闭包的MD5校验
go env -w GOSUMDB=off
#查看环境变量
go env
三.Go语言基础语法
1.Hello World!
js
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
package main表示当前是main包下,import表示引入了fmt库,func为函数关键词,而func main()即当前代码下的主函数。
2.变量与常量
- 变量声明使用
var
关键字 - 常量声明使用
const
关键字 - 变量的定义形式:
var name 【类型】 = 【表达式】
- 变量的简化形式:
name := 【表达式】
Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。
大写字母和小写字母是不同的 :heapSort和Heapsort是两个不同的名字。
Go语言中类似if和switch的关键字有25个;关键字不能用于自定义名字,只能在特定语法结构中使用。
常见的关键词 | ||||
---|---|---|---|---|
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
3.条件语句与循环语句
Go语言中条件语句有如下使用的形式(单if,if-else,if-else嵌套,switch等):
js
package main
import "fmt"
func main() {
if true {
fmt.Println(true)
}
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
a := 2
switch a { //优化版的switch自带break
case 1:
fmt.Println("one") // break;
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
}
值得注意的是Go语言中的switch使用时,我们不需要在case中加入break,这点和Java中的switch不大一样。
循环语句则通过for的关键词来实现(没有while)
js
package main
import "fmt"
func main() {
i := 1
//死循环
for {
fmt.Println("loop")
break //使用break跳出循环
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue //使用continue跳过当前循环
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
}
4.函数
函数是基本的代码块,用于执行一个任务。Go 语言最少有个main函数。函数声明需要告诉编译器函数的名称,返回类型和参数。我们甚至可以将一个函数作为参数传入另一个函数中调用执行,该过程也被称为回调。
js
package main
import "fmt"
func add(a int, b int) int {
return a + b
}
func add2(a, b int) int {
return a + b
}
func add3(a,b int,add_func func(int,int) int) int {
return add_func(a,b)
}
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
func main() {
a := add3(3,4,add)
fmt.Println(a)
res := add(1, 2)
fmt.Println(res) // 3
v, ok := exists(map[string]string{"a": "A"}, "a")
fmt.Println(v, ok) // A True
}
四.Go语言常用库包
下面是Go语言常用的一些库包,有使用需求时现查即可。
fmt
,用于处理格式化输入输出的包html
,html模板操作包net
,提供一系列网络操作的包,相当的强大flag
,命令行参数解析包reflect
,反射操作包log
,自带的日志包sort
,排序操作包regex
,正则表达式包image
,图像操作的包time
,时间操作的包unicode
,unicode字符集操作包unsafe
,提供没有类型限制的指针操作syscall
,操作系统提供的系统调用包testing
,测试包,主要是写测试的时候用。sync
,并发操作包context
,上下文包strconv
,字符串转换包strings
,字符串操作包bytes
,字节切片操作包maps
,map操作包slices
,切片操作包io
,定义了一系列基础的IO接口,例如常用的Closer
,Writer
等,还有一些基础的IO操作函数。io/fs
,定义了一系列文件系统的接口,算是对文件系统的抽象。os
,操作系统进行交互的包,提供的是一系列具体的函数,可以简单理解为是上面两个的具体实现。os/signal
,操作系统信号包,用于监听操作系统的信号,主要用于实现程序的优雅关闭。os/exec
,操作系统命令包,用于执行操作系统命令。os/user
,操作系统用户包,用于获取操作系统的用户信息。bufio
,有缓冲IO读写包。path
,处理斜杠分隔路径的包,例如url之类的。path/filepath
,处理文件路径的包。math
,数学操作包math/bits
,位运算操作包math/cmplx
,复数操作包,也提供了一些三角函数的工具函数。math/rand
,伪随机包math/big
,大数高精度计算包container/heap
,最小堆的实现container/list
,双线链表的实现container/ring
,环的实现archive/zip
,zip压缩归档的包archive/tar
,tar归档文件的包compress
,压缩算法实现的包,比如gzip,flate。database/sql
,与数据库进行交互的包encoding
,处理编码的包,其下有很多子包,比如json
,xml
之类的,还有base64
这种。crypto
,处理加密的包,其下有很多子包,比如sha1,rsa等go/ast
,go源代码抽象语法树映射的包go/parser
,将go源代码解析成抽象语法树的包go/importer
,提供了对导入器的访问go/format
,go语言格式化包areana
,提供可手动分配和释放内存的功能,处于实验阶段runtime
,运行时操作包,go中有许多操作都是这个包实现的。
五.Go语言学习资料
下面是一些Go语言学习资料:
Go语言圣经(Go语言圣经 - Go语言圣经)
Go入门指南(《Go 入门指南》 | Go 技术论坛
Golang中文学习文档(首页 | Golang中文学习文档)