Go语言第一篇 --- 环境配置

可爱的土拨鼠.png

前言

在我们接触一门新的语言的时候,并不着急马上去学习它的语法,应该从一个全局的视角来看看我们接下来要学的语言时一个什么样的语言,值不值得我们去学,它和我们现有的技术栈有什么区别,是否能够解决技术痛点,以上这几点是我觉得学习之前先要了解的。

Go 语言目前还是比较新的语言,它是一种自带并发、具有垃圾回收以及快速编译的静态类型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。同 Java 相比,Go语言有很多不同的地方,比如一开始的公有变量和私有变量的规范,Go语言中变量大写就是公有变量,小写就是私有变量(error除外),Go 内置了线程和队列,实现起来比 Java 简单很多,再比如 Go 的异常处理没有一大推try/catch,等等就不一列举。

Go 语言是 Google 团队的大佬精心打造出来的,成员之一就有大名鼎鼎的 Unix 操作系统的创造者 Ken Thompson,C 语言就是他和已经过世的李奇一起发明的。接下来让我们一起走进 Go 语言的世界吧!

1、环境配置

在我们学习一门新的语言时,通常我们会先写一个 Hello World,Go 语言的 Hello World 如下:

package main

import "fmt"

func main() {
  fmt.Println("hello world!")
}

看起来是不是很简单?我们使用命令

go run main.go

就会得到我们想要的 hello world! 这个时候我已经迫不及待的想要自己试试了,首先我们需要按照 Go 语言的安装包然后再配置一下 GOPATH 环境变量,其实这里的 GOPATH 环境变量也就是你的 workspace。

1.1 Go 语言安装

我们根据自己的机器操作系统选择相应的开发工具包,比如你的是Windows 64位的,就选择windows-amd64的工具包;是Linux 32位的就选择linux-386的工具包。可以自己查看下自己的操作系统,然后选择,我这边选择 Mac 版本的下载就可以了。

Mac 安装 Go

Mac 下安装可以直接用 homebrew 或者 官网下载

brew install go

Mac 会默认给你配置好 GOPATH,如果不喜欢可以自己修改,我的目录是 /Users/sumin/workspace/dev/golang,接下来我们配置环境变量,在终端输入 vim .bash_profile,然后将一下添加进去后保存退出,并执行 source .bash_profile

export GOPATH="/Users/sumin/workspace/dev/golang"
export GOBIN="${GOPATH}/bin"
export PATH="${PATH}:${GOPATH}:${GOPATH}/bin"

然后终端输入

go version

输出对应的版本号表示安装成功

go version go1.11.1 darwin/amd64

以上是针对 Mac 的环境安装教程,Linux 和 Mac 都是基于 Unix ,命令这一块基本差不多,不过 Linux 更 geek 一些,更偏向于命令行操作,比如下载下来的压缩包需要手动解压,Linux 中环境变量的配置和 Mac 稍有不同,Linux 下又两个文件可以配置,其中 /etc/profile 是针对所有用户都有效的;$HOME/.profile 是针对当前用户有效的,可以根据自己的情况选择。

Windows 安装 Go

首先还是从官网下载相应系统的包,解压到自己选的目录下,我的是 F:\Go\, 然后开始配置环境变量,如图所示

image.png

在系统变量中新建 GOROOT,变量值是我们刚刚安装的路径;
修改PATH系统变量,在变量值最后添加 %GOROOT%\bin 路径;
最后配置工作目录 GOPATH,这是我们存放源码的地方,如图是我选择的路径,这个随个人喜好。

同样终端输入

go version

输出对应的版本号表示安装成功

go version go1.11.2 windows/amd64

接下来设置设置我们 GOPATH 下的 src 文件夹下新建如下文件夹

├── bin
├── pkg
└── src
  • bin 文件夹存放 go install 生成的可执行文件,当我们把 GOPATH/bin 加入到 PATH 后,我们可以再终端的任意位置直接执行 go 文件了
  • pkg 文件夹是存在go编译生成的文件
  • src存放的是我们的go源代码,不同工程项目的代码以包名区分

当我们在终端输入 go env 查看编译环境:

image.png

其中有几个重要的参数需要我们注意:

  • GOOS :目标操作系统,当前我的系统是 amd64 位,这个值根据你的操作系统决定
  • GOBIN : 存放可执行文件的目录的绝对路径
  • GOEXE : 当前系统可执行文件的后缀
  • GOPATH : 工作区目录的绝对路径,就是我刚刚设置的工作路径
  • GOROOT : Go语言的安装目录的绝对路径

1.2 Go 命令

接下来我们看一下 Go 有哪些命令

Go 命令.png

简单的过一下,我们常用的一般也就几条,如

go build     用于编译代码
go run       并运行 Go 程序
go doc       查看 Go 文档,但是需要安装相关插件
go version   查看 Go 当前的版本
go clean     移除当前源码包和关联源码包里面编译生成的文件
go fmt       格式化 Go 文件,gofmt -w -l src 可以格式化整个项目
go get       获取远程包,该命令内部执行了两步,第一步是下载源码包,第二步是执行go install
go install   生成可执行文件
...

详细命令可参考官方文档 Here

2、Go Package

Go 语言同 Java 一样都是有包的概念,这也是一种模块化的方式组织代码,在 Go 语言中,包也是类似的概念,它是把我们的 Go 文件组织起来,可以方便进行归类、复用等目的。比如 Go 内置的 net 包

net
├── http
├── internal
├── mail
├── rpc
├── smtp
├── testdata
├── textproto
└── url

以上是 net 包的一个目录结构,net 本身是一个包,net 目录下的 http 又是一个包。从这个大家可以看到,Go 语言的包其实就是我们计算机里的目录,或者叫文件夹,通过它们进行目录结构和文件组织,Go 只是对目录名字做了一个翻译,叫"包"而已。比如这里的 net 包其实就是 net 目录,http 包其实就是 http 目录,这也是 Go 语言中的一个命名习惯,包名和文件所在的目录名是一样的。

2.1 包的命名

首先我们在前面的 Hello World 中声明了一个 main 包,这就和 Java 的 main 函数一个意思,告诉程序我是入口函数,这里 Go 会把声明了 main 的包编译为一个可执行程序,并且同一个项目里只有一个入口文件。

Go 语言中的包名一般遵循小写、和所在目录同名的原则。当我们只有一个项目的时候我们可以直接把文件写在 src 目录下,如果我们有多个项目同时存在,我们就要通过包组织我们的代码了,官网是推荐使用你个人的 github.com,这一点同 Java 中类似。

这里再看下上面的 Hello World 程序

  • 首先我们引入了 package main,这里 package 是一个关键字,定义一个包,和 Java 里的 package 一样,也是模块化的关键。
  • main 包是一个特殊的包名,表示程序执行的入口,而不是一个库。
  • import 也是一个关键字,表示要引入的包,和 Java 的 import 关键字一样,引入后才可以使用它。
  • fmt 是一个包名,这里表示要引入 fmt 这个包,这样我们就可以使用它的函数了。
  • Println 是 fmt 包里的函数,和 Java 里的 system.out.println 作用类似,这里注意 Println 是大写的,至于为啥呢,我们接下来再说。

2.2 包的导入

要想使用一个包,必须先导入它才可以使用,Go 语言提供了 import 关键字来导入一个包,这个关键字告诉 Go 编译器到磁盘的哪里去找要想导入的包,所以导入的包必须是一个全路径的包,也就是包所在的位置。注意:引用了必须使用,否则会报错。

import "fmt"

在我们的 Hello World 中我们打印了一段话,引入了 fmt 包,如果引入多个我们可以如下使用

import "fmt"
import "github.com/sumin/test"  // 远程包引入

// 推荐下面的写法
import (
    "fmt"
    "github.com/sumin/test"
)

2.3 包的别名

在我们开发过程中有可能会出现重复的情况(尽量避免),这个时候我们可以给其中一个设置别名使用,在包的左侧引入,编译器会自动识别该别名。

package main

import (
    "fmt"
    su_fmt "github.com/sumin/fmt"
)

func main() {
    fmt.Println()
    su_fmt.Println()
}

还有上面那个问题,Go 语言规定导入的包必须引用,这样确实避免了我们引用很多无用的包增加代码量,对于维护简直友好度MAX!但是有的时候我们需要导入一个包执行包里的 init 函数而不想引用它,这个时候可以使用 Go 内置的空白标识符 _,还是拿上面的代码举例

package main

import (
    "fmt"
    _ "github.com/sumin/fmt"
)

func main() {
    fmt.Println()
}

3、 编辑器

工欲善其事必先利其器,我们使用一个顺手的编辑器开发也会省心不少。不过 Go 不怎么挑剔编辑器,它本身采用的是 UTF-8 的文本文件存放源代码,所以原则上你可以使用任何文本编辑器。

对于我这种新手来说 Jetbrains idea + Go 插件最省心,当然也有专门支持 Go 语言的 GoLand 下载地址

同时也推荐使用 vscode,内置 Go 全家桶,轻便简洁,主要是好看,不过需要手动下载 Go 插件。

小结

第一篇关于 Go 的准备工作就到这里吧,大概讲了的 Go 开发安装配置、环境搭建、Go 相关命令,后面还介绍了 Go 的安装和包管理以及编辑器这一块,接下来会继续学习 Go 的基础语法和库,加油~

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

推荐阅读更多精彩内容

  • 申金鑫 17101223365 转载自公众号flysnow_org 【嵌牛导读】:本文介绍了各种系统下的Go语言环...
    Felixxin阅读 3,373评论 0 20
  • 申金鑫 17101223365 转载自知乎专栏 Go语言实战笔记 【嵌牛导读】:本教程详细介绍了Go语言的一些包的...
    Felixxin阅读 479评论 0 1
  • 欢迎扫码关注公众号flysnow_org,第一时间看后续文章。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。 前段...
    飞雪无情flysnow_org阅读 33,164评论 4 45
  • 选择Go语言 Go语言是在2009年推出,2012年开始在生产环境使用。自此以后,Go语言拥有全球开发者的热爱,特...
    范彬2017阅读 1,535评论 0 15
  • 1. 分布式系统核心问题 参考书籍:《区块链原理、设计与应用》 一致性问题例子:两个不同的电影院买同一种电影票,如...
    molscar阅读 904评论 0 0