1-初始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.png

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

    git_hut_pull_request_for_go2.png

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

现状

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

chinese_company_use_go.png

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

Go语言的优劣

优势

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

Go语言的应用场景

应用场景总览

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

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文件中追加以下几行
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里。如下图

设置go环境变量1.png

设置go环境变量2.png

设置go环境变量3.png

设置go环境变量4.png

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

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语言的插件,如下图

go_plugin_for_vscode.png

第一个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

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

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环境信息。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361

推荐阅读更多精彩内容