Lupinus

Re:从零开始的go学习生活(`・ω・´)

0%

[初识Go语言]

初识Go语言

Go语言发展历史

阵容豪华的创使人团队

Ken Thompson

  • 1966年:加入了贝尔实验室,在参与 Multics (多路信息计算)开发期间,创造出了B语言,并用一个月的时间用B语言开发了全新的操作系统UNICS,后来改名为我们所熟悉的UNIX 操作系统。
  • 1971年:和丹尼斯·利奇(Dennis Ritchie)一起共同发明了C语言。
  • 1973年:和丹尼斯·利奇(Dennis Ritchie)使用C语言重写了UNIX,并安装于PDP-11的机器之上。
  • 1983年:美国计算机协会将图灵奖授予汤普森。
  • 2000年:离开贝尔实验室,已退休的汤普森成为了一名飞行员。
  • 2006年:加入Google工作。
  • 2007年:64岁的高龄,与Rob Pike和Robert Griesemer主导了Go语言的开发。

Rob Pike

  • Go语言项目总负责人。
  • 贝尔实验室Unix团队成员,参与的项目包括Plan 9,Inferno操作系统和Limbo编程语言。
  • UTF-8字符集规范唯二的发明人之一(另一位是Ken Thompson)。
  • 《UNIX环境编程》和《程序设计实践》这两本书的作者之一。
  • 第22届莫斯科夏季奥运会射箭项目的银牌得主。
  • 业余天文学家,设计的珈玛射线望远镜差点被 NASA 用在航天飞机上。
  • 他的媳妇Renee French 就是 Go 语言吉祥物的设计人。

Robert Griesemer

  • 参与V8 JavaScript引擎的开发。
  • 参与Java HotSpot虚拟机的研发。

起源

  2007年,Google的几位大牛正在用C++开发一些比较繁琐但是核心的工作,主要是分布式集群,大牛觉得很闹心。此时C++委员会来他们公司做技术演讲,说C++将要添加35个新特性,大牛心里飘过一万个CNM,“C++特性还不够多吗”。于是Rob Pike说要不自己搞个简单一点的语言吧,首先名字得简单好记,大腿一拍就叫“go”。
  把事情搞复杂很容易,把事情搞简单才更深刻。

发展

  • 2007年9月21日,开始雏形设计。
  • 2009年10月30日,Rob Pike宣布了Go语言的存在。
  • 2009年11月10日,以完全开源的方式公布了Linux和Mac OSX上的版本,11月22日公布了Windows版本。
  • 2010年1月8日,当选2009年年度语言。
  • 2010年5月,谷歌投入使用。
  • 2011年4月,谷歌开始抽调员工全职开发Go语言,并于5月宣布Google APP Engine支持Go语言。

tiobe_index_for_go

参考网站https://www.test.tiobe.com/tiobe-index/go。

avatar
avatar

参考网站https://madnight.github.io/githut/#/pull_requests。

现状

  从世界范围看,Go语言在中国的发展势头最猛,且远超第二名。在很多互联网大厂Go已成为主要开发语言。

avatar

  不论大小公司,对Go人才需求紧迫,薪酬很高。

avatar

Go语言的优劣

优势

  • 语法简单,易于学习。类C的语法,同时比C/C++简洁和干净。
  • 自带GC,方便使用。
  • 快速编译,高效执行。
  • 简单的依赖管理。
  • 并发编程,轻松驾驭。
  • 静态类型,同时有一些动态语言的特征(var声明)。
  • 标准类库,规范统一。
    劣势
  • 不支持动态加载代码。
  • 发展时间短,生态不及Java、C++庞大,但是够用。

Go语言的应用场景

应用场景总览

  • 巨型中央服务器领域。
  • 高性能分布式领域。
  • 游戏服务端开发。
  • 复杂事件处理。
  • 对实时性要求很高的软件开发。
  • 可以在Intel和ARM处理器上运行,因此也可以在安卓上运行。

avatar

go微服务开发

  • 零依赖,让我们可以最小化我们的镜像,节省存储与拉取镜像带宽。
  • Runtime使用更小的内存,对比Java的JVM。
  • 更好的并行能力,当你真的需求更多CPU的时候。
  • 更高的性能,对比解释性语言,在处理数据已经并发方面优势明显。
  • 简单,学习成本低,内部人员可以转入Go阵营。
  • 使用Go能更接近云原生生态,比如docker,k8s, habor都是用Go开发的。

开发环境搭建

  1. 下载。到https://studygolang.com/dl上下载最新的Go稳定版本。
  2. 安装。对于Windows和macOS用户,直接双击即可安装,留意一下安装路径。对于Linux用户,直接解压安装包即可,比如你打算把go安装到/usr/local目录下,则使用命令
    tar zxvf goxxx.tar.gz –C /usr/local。这样go标准库及相关的可执行文件就安装到了/usr/local/go目录下,在后续的步骤中会把/usr/local/go赋给GOROOT环境变量。
  3. 准确GOPATH。在任意目录下创建一个空目录,将来用于存放go语言第三方库文件。比如你打算使用/data/go_path这个目录,则在Linux下使用命令mkdir -p /data/go_path。在GOPATH目录建3个子目录:src、bin、pkg。
  4. 配置环境变量。把第2步和第3步生成的目录分别赋给GOROOT和GOPATH环境变量,对于Linux和Mac用户在~/.bashrc文件中追加以下几行
  5. GOPROXY的设置参考:https://goproxy.io/zh/
1
2
3
4
5
6
7
export GOROOT=/usr/local/go
export GOPATH=/Users/Amor/go_path
export PATH=$PATH:$GOROOT/bin::$GOPATH/bin

source ~/.bashrc

注意:apple M1在~/.zshrc下写入

PATH环境变量下的可执行文件在任意目录下都可以直接访问。
对于Windows用户,编辑用户环境变量,新增GOROOT和GOPATH,把GOROOT/bin和GOPATH/bin添加到Path里。如下图
avatar

avatar

avatar

avatar

在Windows下还可以通过go env -w来设置环境变量,比如设置GOPROXY用以下命令

1
go env -w GOPROXY=https://goproxy.cn,direct

有很多网站支持在线编辑Go代码并查看运行结果,这里列举一些
https://play.golang.wiki
https://play.studygolang.com
https://goplay.space
https://goplay.tools
集成开发环境推荐GoLand和VSCode,后者是免费的。VSCode需要额外安装支持Go语言的插件,如下图

avatar

Debug工具安装

1
xcode-select --install

第一个Go程序

1
2
3
4
5
6
7
8
9
package main

import (
"fmt"
)

func main() {
fmt.Println("Hello World")
}

main()函数是Go程序的唯一入口,且main()函数必须位于package main中。fmt是Go标准库中的一个package,该package下有一个Println()函数用于输出字符串。Go语言会依次从以下3个目录里查找依赖包:

  1. 当前工作目录
  2. $GOPATH/pkg/mod
  3. $GOROOT/src

Go命令介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
(base) zcymac:~ zcy$ go help
Go is a tool for managing Go source code.

Usage:

go <command> [arguments]

The commands are:

bug start a bug report
build compile packages and dependencies
clean remove object files and cached files
doc show documentation for package or symbol
env print Go environment information
fix update packages to use new APIs
fmt gofmt (reformat) package sources
generate generate Go files by processing source
get add dependencies to current module and install them
install compile and install packages and dependencies
list list packages or modules
mod module maintenance
run compile and run Go program
test test packages
tool run specified go tool
version print Go version
vet report likely mistakes in packages

Use "go help <command>" for more information about a command.

Additional help topics:

buildconstraint build constraints
buildmode build modes
c calling between Go and C
cache build and test caching
environment environment variables
filetype file types
go.mod the go.mod file
gopath GOPATH environment variable
gopath-get legacy GOPATH go get
goproxy module proxy protocol
importpath import path syntax
modules modules, module versions, and more
module-get module-aware go get
module-auth module authentication using go.sum
packages package lists and patterns
private configuration for downloading non-public code
testflag testing flags
testfunc testing functions
vcs controlling version control with GOVCS

Use "go help <topic>" for more information about that topic.

go help: 查看帮助文档。

1
go help build

go build: 对源代码和依赖的文件进行打包,生成可执行文件。

1
go build -o my_first_go_exe entrance_class/demo.go

go install: 编译并安装包或依赖,安装到$GOPATH/bin下。

1
go install entrance_class/demo.go

go get: 把依赖库添加到当前module中,如果本机之前从未下载过则先下载。

1
go get github.com/tinylib/msgp

以上命令会在$GOPATH/pkg/mod目录下会生成github.com/tinylib/msgp目录。

1
go install github.com/tinylib/msgp@latest

以上命令会在$GOPATH/bin下生成msgp可执行文件。
go mod init module_name
初始化一个Go项目。
go mod tidy通过扫描当前项目中的所有代码来添加未被记录的依赖至go.mod文件或从go.mod文件中删除不再被使用的依赖。
go run: 编译并运行程序。
go test: 执行测试代码。
go tool: 执行go自带的工具。go tool pprof对cpu、内存和协程进行监控;go tool trace跟踪协程的执行过程。
go vet: 检查代码中的静态错误。
go fmt: 对代码文件进行格式化,如果用了IDE这个命令就不需要了。

1
go fmt entrance_class/demo.go

go doc: 查看go标准库或第三方库的帮助文档。

1
2
go doc fmt
go doc gonum.org/v1/gonum/stat

go version: 查看go版本号。
go env: 查看go环境信息。