Go语言学习笔记-初识Go语言

初识Go语言

1. Go语言发展历史

1.1 阵容豪华的创使人团队

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虚拟机的研发。

1.2 起源

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

  把事情搞复杂很容易,把事情搞简单才更深刻。

1.3 发展

  • 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语言。

在这里插入图片描述

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

在这里插入图片描述在这里插入图片描述

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

1.4 现状

  从世界范围看,Go语言在中国的发展势头最猛,且远超第二名。在很多互联网大厂Go已成为主要开发语言。
  不论大小公司,对Go人才需求紧迫,薪酬很高。

2. Go语言的优劣

优势

  • 语法简单,易于学习。类C的语法,同时比C/C++简洁和干净。
  • 自带GC,方便使用。
  • 快速编译,高效执行。
  • 简单的依赖管理。
  • 并发编程,轻松驾驭。
  • 静态类型,同时有一些动态语言的特征(var声明)。
  • 标准类库,规范统一。

劣势

  • 不支持动态加载代码。
  • 发展时间短,生态不及Java、C++庞大,但是够用。

3. Go语言的应用场景

3.1 应用场景总览

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

在这里插入图片描述

3.2 go微服务开发

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

4. 开发环境搭建

  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文件中追加以下几行
export GOROOT=/usr/local/go
export GOPATH=/data/go_path
export PATH=$PATH:$GOROOT/bin: :$GOPATH/bin

  PATH环境变量下的可执行文件在任意目录下都可以直接访问。
  对于Windows用户,编辑用户环境变量,新增GOROOT和GOPATH,把GOROOT/bin和GOPATH/bin添加到Path里。如下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  在Windows下还可以通过go env -w来设置环境变量,比如设置GOPROXY用以下命令

go env -w GOPROXY=https://proxy.golang.com.cn,direct 

  关于GOPROXY的设置可参考 https://goproxy.io/zh/

环境变量的含义

  • GOROOT是go的安装目录,go原生的工具在该目录下
  • GOPATH通常存放第三方依赖库
  • GOPROXY:下载依赖库时走哪个镜像代理,可以公司内部自建镜像,比如export GOPRIVATE=git.my.com,github.com/my/private
  • PATH下的二进制文件可以在任意目录下直接运行
  • 在$GOPATH目录建3个子目录:src、bin、pkg

Go Modules依赖包查找机制

  • 下载的第三方依赖存储在$GOPATH/pkg/mod下
  • go install生成的可执行文件存储在$GOPATH/bin下
  • 依赖包查找顺序:
    • 工作目录
    • $GOPATH/pkg/mod
    • $GOROOT/src

有很多网站支持在线编辑Go代码并查看运行结果,这里列举一些

https://play.golang.wiki
https://play.studygolang.com
https://goplay.space
https://goplay.tools

集成开发环境推荐GoLand和VSCode,后者是免费的。VSCode需要额外安装支持Go语言的插件,如下图

5. 前三个Go程序

5.1 第一个Go程序:Hello World

PS E:\Golang\week01>mkdir week01
PS E:\Golang\week01>cd week01
PS E:\Golang\week01>go mod init week01
go: creating new go.mod: module week01
PS E:\Golang\week01> dir
    目录: E:\Golang\week01
Mode                 LastWriteTime         Length Name                                          
----                 -------------         ------ ----                                          
d-----         2022/8/15      9:48                .idea
d-----         2022/8/15      9:48                dir
d-----         2022/8/15      9:48                sub
-a----         2022/8/15     20:47             59 go.mod
-a----         2022/7/28     21:03            257 go.sum
-a----         2022/7/29     13:53            370 hello.go
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

在$GOROOT\src目录下有一个fmt目录

5.2 第二个GO程序:跨包引用

在这里插入图片描述

5.3 第三个Go程序:第三方库依赖

go get -u gonum.org/v1/gonum/stat

在这里插入图片描述在这里插入图片描述
在$GOPATH/pkg/mod目录下会生成gonum.org/v1/gonum/stat目录

package main
import (
	"fmt"
	"gonum.org/v1/gonum/stat"
)
func main() {
	fmt.Print("你好,CHINA!\n")
	stat.Entropy(nil)
}

6. Go命令介绍

(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: 查看帮助文档。

go help build

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

go build -o my_first_go_exe entrance_class/demo.go
PS E:\Golang\week01> go build -o say.exe .\hello.go
PS E:\Golang\week01> .\say.exe
你好,CHINA!
123456789
hello 888

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

go install entrance_class/demo.go

在这里插入图片描述

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

go get github.com/tinylib/msgp 

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

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这个命令就不需要了。

go fmt entrance_class/demo.go

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

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

go version: 查看go版本号。

go env: 查看go环境信息。

module week01

go 1.19

require gonum.org/v1/gonum v0.11.0 // indirect
package main

import (
     "fmt"
     "gonum.org/v1/gonum/stat"
)
func main() {

	//fmt.Println("你好,CHINA!")
	//fmt.Println("123456789")

	//fmt.Print("你好,CHINA!")
	//fmt.Println("123456789")

	//fmt.Print("你好,CHINA!\n")
	//fmt.Println("123456789")
	//fmt.Printf("hello %d", 888)
	//stat.Entropy(nil)
	var a int //variable integer
	//var b int
	//var c int
	a = 4
	//b = 3
	//c = 5
	fmt.Printf("hello %d", a)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值