golang_01-你的第一个golang程序

为什么学习golang

  • Google开源

    一提到Google,搞技术的想到的一般都是技术大厂,像很多现在业界主流的技术都是通过Google发表的论文来的,比如Grafana、prometheus等等都是来自Google的。

    Go语言首先是萌芽于Google公司内部的语言,当时的Google中的大牛都是写C++的,大家都知道C++的特点,比较难、编译的时候时间比较久,然后这些写C++哥们儿写来写去发现太麻烦了,于是乎他们就造了一个自己的语言,这就是Go语言,下图是他们的主要作者。

    image-20200327201239448

  • 编译型语言

    什么是编译型语言什么是解释型语言可以看一下之前写初识python的时候已经写的很详细了,这里提一下编译型的优点型语言的优点它因为编译只做⼀次,运⾏时不需要编译,所以编译型语⾔的程序执⾏效率⾼。可以脱离语⾔环境独立运⾏。

  • 21世纪的C语言

    为啥说是21世纪的C语言呢,大家现在普遍接触到的,市面上主流的编程语言,包括C、C++、Python、Java、PHP等等,这些语言发布的年代基本都是上个世纪九十年代或以前,那当时的有什么特点呢,当时的处理器都是单核的,直到2005年AMD公司才发布了第一个商用的多核处理器,2007年的时候Go语言这个项目才在Google公司内部萌芽,这说明了什么呢,说明Go语言在发布的时候市面上就已经有成熟的多核处理器的技术存在了,所以在这个语言的诞生之初就已经考虑到了多核处理器的适配问题。

    image-20200327205157880

    现在我们用Go语言写的程序,编译成二进制的执行文件,放到服务器上去运行的时候,在1.5版本之后默认是跑满整个CPU的,也就是你有8个核,我就跑慢8个核,区别于像Redis这种,只占单核心。这也是Go语言为什么天生支持并发,那么之前的那些语言该怎么办呢,就通过不断的加一些框架,加一些语法糖。像Java有很多高并发的异步框架、Python加了很多像Async IO 这种拗口的语法,加了很多的语法来不断的提高语言的支持性

安装Go语言

Go官网下载地址:https://golang.org/dl/

Go官方镜像站(推荐):https://golang.google.cn/dl/

上面是Go语言的官方下载链接,因为Go语言是Google的,所以在中国可能会被墙,这里我们推荐用下面的官方镜像站

image-20200327211333693

在我写这篇文章的时候目前的golang的版本是1.14.1,点击下载与系统相应的版本就可以了,windows和macOS下载的都是图形化界面的安装包,修改一下相应的安装路径,一路next就可以啦。

安装完Go语言之后在cmd下输入go env,这里面有一个GOPATH,这个GOPATH是一个历史的产物,在go1.11之前他规定我们写代码必须在GOPATH下写代码,不能在别的地方写,这个GOPATH我们只用在安装完GO语言之后,配一下环境变量即可。在Go语言1.11之后你就可以不在GOPATH下写代码了,只要你开启了GO111MODULE这个模式。 在1.14的版本是默认开启这个模式的。

image-20200327212732223

值得注意的是,安装完Go语言,记得配一下环境变量GOPROXY,GOPROXY的默认的网址是Google的网址,在国内可能会被墙,所以我们把GOPROXY配成https://goproxy.cn,direct 具体环境变量怎么配看下图

此电脑(右键)->属性->高级系统设置->环境变量

image-20200327213449842

配完GOPROXY,我们基本上就搞定了,这里我们可以重新打开一个cmd(一定要打开一个新的cmd啊!!!)再次输入go env 查看GOPROXY的值。

开发环境

Go采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做Go语言开发,这里推荐使用VS CodeGolandVS Code是微软开源的编辑器,而Goland是jetbrains出品的付费IDE。

我们这里使用Goland 做为go语言的开发工具。我们从jetbrains的官网上下载Goland

image-20200327214930404

安装和之前安装Go语言一样,修改一下相应的安装路径,一路next就可以啦。

安装完后运行Goland选择你喜欢的主题,start using 就可以啦

image-20200327215459568

由于这是个付费的IDE所以你可能需要购买他的使用权进行激活。下图是安装好后Goland的初始界面

image-20200327220155288

我们在平时写代码的目录下新建一个文件夹,我这里以D:\mycode\learn_go为例

image-20200327220706040

选择open Project 选择D:\mycode\learn_go目录进入即可,如图我们创建一个文件夹来存放我们最近写的基础语法的Demo。

image-20200327221331905

你的第一个golang程序

那么我们先写一个所有变成语言的入门程序HelloWorld。

首先在basis目录下new一个directoryHelloWorld,然后我们在HelloWorld下new一个Go Filemain.go,New Go File的时候要选下面那个Simple Application.

image-20200327222302173

image-20200328002342244

如果出现以下问题,我们只需告诉IDE我们的SDK在哪就可以了

image-20200327222431975

image-20200327222813224

然后我们开始写代码,你会发现你刚创建好的go文件的第一行自己就出现了一个package XXXX,如果你刚刚不小心创建文件的时候选了第一个Empty File,那么这里我们将其改为package main ,然后写下如下代码

package main

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

你会发现他自动多了一行import "fmt",这是Goland的自动导包的功能。右键代码边上空白处单击Run go build main.go即可编译执行,如下图。

image-20200327223834862

上面已经完成了你的第一个golang程序,那么你心里一定有很多的问号,这些都是些什么意思呢,我们接着往下讲,先解释一下我们最后一步Run go build main.go是干什么的?这里的Run go build main.go就是编译程序并执行的意思。

go build

go build表示将源代码编译成可执行文件。我们下面演示一下在cmd中编译程序并执行。首先打开main.go的所在目录,并在地址栏敲下cmd

image-20200327234219160

输入go build main.go并回车

image-20200327234419962

如上图,发现执行完go build main.go之后,文件夹中多出来了一个名为main.exe的文件,这就是我们将main.go编译后生成的可执行文件(ps : macOS或者Linux中生成的执行文件是没有后缀的,即main)。我们来执行这个文件,得到的结果就是输出一个HelloWorld!,如下图。

image-20200327235013565

go build除了这么用 他还可以带参数,也可以啥都不带直接执行

image-20200327235742953

如上图所示,当go build后面什么都不带的时候,会发现go build将源代码编译成了与项目名(main.go所在的文件夹)同名的.exe文件,当go build后面带上参数-o加文件名的时候,会编译成你想要的文件名

go build              	
//编译成与项目名同名的.exe文件

go build -o 你想要的文件名 源文件名
//编译成你想要的文件名

那么我们回过头来看Goland的控制台,点击4 go setup calls我们会发现其实Goland就是用的go build的方法来编译生成了一个临时的.exe文件,并执行了该程序。

image-20200328001809990

GOROOT=D:\Program Files\Go #gosetup
GOPATH=C:\Users\sanmu\go #gosetup
"D:\Program Files\Go\bin\go.exe" build -o C:\Users\sanmu\AppData\Local\Temp\___go_build_main_go.exe D:/mycode/learn_go/basis/HelloWorld/main.go #gosetup
C:\Users\sanmu\AppData\Local\Temp\___go_build_main_go.exe #gosetup

跨平台编译

默认我们go build的可执行文件都是当前操作系统可执行的文件,如果我想在windows下编译一个linux下可执行文件,那需要怎么做呢?

只需要指定目标操作系统的平台和处理器架构即可:

SET CGO_ENABLED=0  // 禁用CGO
SET GOOS=linux  // 目标平台是linux
SET GOARCH=amd64  // 目标处理器架构是amd64

使用了cgo的代码是不支持跨平台编译的

然后再执行go build命令,得到的就是能够在Linux平台运行的可执行文件了。

Mac 下编译 Linux 和 Windows平台 64位 可执行程序:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Linux 下编译 Mac 和 Windows 平台64位可执行程序:

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

Windows下编译Mac平台64位可执行程序:

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build

golang文件的基本结构

讲完了编译,我们回过头来看代码,首先所有Go语言的代码都放到.go文件里面去

package main
import "fmt"
func main() {
	fmt.Println("HelloWorld!")
}

一共5行代码,分别都是些什么意思呢,我们接下来一行一行的讲。

package main

所有的.go文件都需要有一个package的声明,package是一个关键字,用来声明这个文件属于哪个包,后面跟的是包的名字。这里特别注意的是如果你的package后面跟的是一个main包,那么说明你的代码最终会编译成一个可执行的二进制文件。如果你想要你的main包能够编译的话,那么你就需要下面的main函数。

func main() {
    
}

这里的main函数是整个程序的入口,也就是说你的整个程序是从main函数开始执行,main函数是没有参数也没有返回值的。

import "fmt"

这是一个导入语句,比如说我们导入内置的包,第三方的包,都是通过import来导入的,后面跟的包名需要用""来包裹。

值得注意的是,在Go语言里,你在函数的外面只能放一些标识符(变量、常量、函数、类型等)的声明,不能放逻辑语句,他和python不一样,你是不能在函数外写语句,你像在func main(){}外面写一句打印语句fmt.Println("XXXXX")是不行的。

那么至此为止,你的第一个golang程序就到这里啦,bye~