背景介绍
自我介绍
笔者先做自我介绍,从事java开发5年。
近期公司要求开始技术转型,各种语言如java、php都逐渐在新项目上开始使用go语言进行编写。身为一个java的coder,心里当然想的是:java是世界上最优秀的语言。但是耐不住共军有高达啊,只能让自己的学习细胞在而立之年继续爆肝了。
首先要了解一下
Go的背景
Go 语言是由 Google 出品的的一门通用型计算机编程语言。种种亮点以及快速崛起的编程语言吸引着广大编程爱好者,近年来受到热捧 Go 已经成功跻身主流编程语言的行列。许多大厂也都已经拥抱 Go 语言,包括阿里巴巴、小米、滴滴、今日头条、奇虎360、京东、Bilibili、知乎、美图、猎豹移动等。
Go 程序可以装在有 Windows、Linux、FreeBSD等操作系统的服务器上运行,并用于提供基础软件支撑、API 服务、WEB 服务、网页服务等。Go 语言也在移动端上进行了积极的探索,现在在 Android 和 iOS 上都可以运行其程序。另外,Go 语言也已经和 WebAssembly 联合,加入了 WASM 平台。这意味着过不了多久,互联网浏览器也可以运行 Go 编写的程序了。
从业务维度看,在云计算、微服务、大数据、区块链、物联网等领域,Go 语言早已蓬勃发展。有的使用率已经非常之高,有的已有一席之地。即使是在 Python 为王的数据科学和人工智能领域,Go 语言也在缓慢渗透,并初露头角。
好家伙,大家都开始拥抱变化(内卷)了,那我们也不能落下。
直接步入正题
搭建环境
go安装包
首先声明一下自己使用的是macbook非M1版本,仅供大家参考,以下的内容都是基于mac环境进行实操。
go的官网:golang.org(需要科学上网),被墙了,对这个操作,我只想说:墙的不错,下次不要这么墙了。
但是呢这肯定难不倒我们这些老兵。除了梯子以外,可以使用国内网站:
go语言中文网:首页 - Go语言中文网 - Golang中文社区
进入网站-下载,选择pkg安装包进行下载,我使用的是1.15.5版本,如有需要可以下载更新的版本;下载完成后一键傻瓜式安装。
安装完成后打开命令行,执行:go version
即可查看go当前版本啦
$ go version
go version go1.15.5 darwin/amd64
环境变量
玩java的都知道环境变量里有个javahome,其实go语言也不例外
在命令行执行:go env
$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/didi/Library/Caches/go-build"
GOENV="/Users/didi/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/didi/work/pkg/mod"
GONOPROXY="git.xiaojukeji.com"
GONOSUMDB="git.xiaojukeji.com"
GOOS="darwin"
GOPATH="/Users/didi/work"
GOPRIVATE="git.xiaojukeji.com"
GOPROXY="https://goproxy.io"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/kk/scjczfqx22n3fxj0pwj4gkrc0000gn/T/go-build133125836=/tmp/go-build -gno-record-gcc-switches -fno-common"
大家可能会看到非常多的环境变量配置,目前来看,我们并不需要做什么改变,先让我们的go工程跑起来再说。对于go环境变量每个的作用,可以后面单独拿一集出来交流。
目前可以只记以下内容
GOPATH: 你编写代码存放的目录
GOROOT: go安装的路径
cd 进入到自己的GOROOT目录下,创建3个文件夹bin pkg src
其中,bin存放编译后的可执行文件;pkg存放编译后的包文件;src存放项目源文件。
一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可。
如果出现GOPATH路径找不到的情况,可以手动把GOPATH目录配置到环境变量中
export GOPATH="/Users/aaa/go"
至此基本准备工作就全部完成了。
开发工具
开发java的同学一般使用idea,eclipse,vscode,sublime等等
go语言的开发,在这里我推荐使用goland或vscode
goland不必多说,付费软件的优势毕竟还是在这点,功能齐全,扩展性也好;
vscode免费,但是插件的安装较为麻烦,不少go插件无法自动安装,需逐一下载包;
笔者在这里使用的是goland,让我们一起来搭建第一个hello world吧!
Hello Go!
新建一个目录:
1-firstGolang
再新建一个文件hello.go
.
├── firstGolang
└── hello.go
再按此格式编写一个go程序,建议第一次编写尽量纯手敲代码,感受一下go语言的语法。
package main //主程序所在的包名
import (
"fmt"
"time"
)
func main() { //函数的左括号{一定要和函数名在同一行,否则编译会错误
//golang中的表达式,加不加;都可以,建议是不加
fmt.Println("hello world Go!") //每行语句可以没有分号,但是有分号也可以
time.Sleep(1 * time.Second)
fmt.Println("hello world Go after 1 second!") //每行语句可以没有分号,但是有分号也可以
}
我们来逐行分析一下。
首先第一行package,这里package指的是所在的包名,这里和java的包有点相似,同一个包下的变量、函数也是可以互相调用的。
下面是import,这里导入和java的写法不同,java的写法往往是具体的类全名,比如java.util.Map,但是在go中,import导入时不需要写全名。这种写法更像是js中的导入写法,如react框架ant-design使用时导入Card一样。
func main是main函数,这个和java很像
- go语言以包作为管理单位
- 每个文件必须先声明包
- 程序必须有一个main包(重要),没有程序无法编译
- 每个import的函数必须被调用
- ……
需要注意的事项很多,其中第4点和java有很大的不同,java中如果import了一个类,并没有使用不会编译报错,而在go中会强制要求使用或者剔除。
运行
可以用goland编译器上带的箭头来启动
也可使用命令行启动,在.go文件所在目录执行go run hello.go
$ go run hello.go
hello world Go!
hello world Go after 1 second!
也能看到结果
到此,我们的第一个go程序就运行成功啦!