初识Golang,集简洁与性能与一体的语言

文章目录

    • 一、Go语言介绍
    • 二、Go语言特性
    • 三、Go语言用途
    • 四、开发环境搭建
    • 五、建立工作区并创建Go程序
    • 六、入口文件基本代码介绍
    • 七、go命令介绍
      • 7.1 基本命令
      • 7.2 build 与 run命令
      • 7.3 install命令介绍
    • 八、命名规范
      • 8.1 变量规范定义
      • 8.2 关键字
      • 8.3 保留字
      • 8.4 需要注意的问题

道阻且长,行则将至,行而不辍,未来可期。人生是一条且漫长且充满荆棘的道路,一路上充斥着各种欲望与诱惑,不断学习,不断修炼,不悔昨日,不畏将来!
GO语言也被称为21世纪的C语言,在开发与性能效率上都占据优势(Python+C)。让我们一起来了解这门语言的魅力吧,希望这篇能够带给你们或多或少的帮助!!

初识Golang,集简洁与性能与一体的语言_第1张图片

本章节开始,我们将步入Go语言的学习,希望它能够成为您的得力工具,让我们一起来了解这门编程语言的魅力所在吧。笔者将会持续更多Go语言相关内容…

一、Go语言介绍


Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。

Go是静态强类型语言,是区别于解释型语言的编译型语言

  • 静态:创建变量时必须声明类型
  • 强类型:不同类型不允许直接运算
  • 编译型:在程序运行之前首先将源代码编译成机器码(二进制)再由机器来运行

Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。

Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。


二、Go语言特性


GC、内存管理、Goroutine、编译迅速、跨平台编译

简洁、快速、安全:

Go语言的语法规则严谨,没有歧义,更没什么黑魔法变异用法。任何人写出的代码都基本一致,这使得Go语言简单易学。放弃部分“灵活”和“自由”,换来更好的维护性,这是值得的。

并发编程:

Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine:主Goroutine。当程序启动时,它会自动创建。

高并发是Golang语言最大的亮点

很多人将GO语言称为21世纪的C语言,因为GO不仅拥有C的简洁和性能,而且还很好的提供了21世纪互联网环境下服务端开发的各种实用特性,让开发者在语言级别就可以方便的得到自己想要的东西。


三、Go语言用途


  • 服务端开发
  • 分布式系统,微服务
  • 网络编程
  • 区块链开发
  • 内存KV数据库,例如boltDB、levelDB
  • 云平台

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

2015年8月 go1.5发布,这个版本被认为是历史性的。完全移除C语言部分,使用GO编译GO(自举),少量代码使用汇编实现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。

Go语言是Google公司创造的语言,也是Google主推的语言。国外如Google、AWS、Cloudflare、CoreOS等,国内如七牛、阿里、小米、京东等都已经开始大规模使用Golang开发其云计算相关产品。

有人说:GO语言之所以出名,是赶上了云时代。但为什么不能换种说法?是GO语言促使了云的发展呢?


四、开发环境搭建


Go安装包下载地址:https://golang.org/dl/

初识Golang,集简洁与性能与一体的语言_第2张图片Linux安装:


1、下载二进制包:go1.13.3.linux-amd64.tar.gz
2、将下载的二进制包解压至 /usr/local目录。

tar -C /usr/local -xzf go1.16.5.linux-amd64.tar.gz

3、将 /usr/local/go/bin 目录添加至PATH环境变量:

//这样在任意 位置敲 go 就可以执行
export PATH=$PATH:/usr/local/go/bin

Mac安装:


Mac下直接双击go1.16.5.darwin-amd64.pkg,一路下一步安装即可


Window安装:


Windows 下可以使用 .msi 后缀(在下载列表中可以找到该文件,如go1.16.5.windows-amd64.msi)的安装包来安装。

默认情况下 .msi 文件会安装在 C:\Go 目录下。将 C:\Go\bin 目录添加到 Path 环境变量中。添加后你需要重启命令窗口才能生效(默认已经添加了,这样在cmd窗口下敲 go 能找到该命令)


配置GOPATH和GOROOT:

GOPATH:
	代码存放路径,该目录下有三个文件夹(如果没有,要手动创建),
	windows和mac默认在用户名下的go文件夹(GOPATH="/Users/ziye/go")
	
		-src——源码(包含第三方的和自己项目的)
		-bin——编译生成的可执行程序
		-pkg——编译生成的包文件
	
GOROOT:go开发工具包的安装路径,Mac默认:/user/local/go

将GOROOT下的bin路径加入环境变量(默认已处理)这样任意位置敲 go 都能找到该命令

windows下修改在系统变量里添加Go文件的存放位置
变量名:GOPATH
变量值:C:\>GoProject

# Mac永久保存环境配置,vim ~/.bash_profile 或者 vim ~/.zprofile(根据自己终端配置来决定)
export PATH=/usr/local/go/bin:$PATH # 确保直接使用go命令能够找到编译器
export GOROOT=/usr/local/go # go编译器安装目录
export GOPATH=/Users/ziye/go # 存放项目代码,编译后等可执行文件、编译后生成的包文件
export GOBIN=/Users/ziye/go/bin # 编译后可执行文件存放目录

安装完成后在终端测试:出现反馈则说明安装成功
初识Golang,集简洁与性能与一体的语言_第3张图片

IDE推荐使用Jetbrains系列的GoLand编辑器,下载地址:https://www.jetbrains.com/go/


五、建立工作区并创建Go程序


在编写代码之前,我们首先应该建立 Go 的工作区(Workspace),在上面环境搭建时我们已经讲过了。

在 Mac 或 Linux 操作系统下,Go 工作区应该设置在 $HOME/go。所以我们要在 $HOME 目录下创建 go 目录。

而在 Windows 下,工作区应该设置在 C:\Users\用户名\go。所以请将 go 目录放置在 C:\Users\用户名

其实也可以通过设置 GOPATH 环境变量,用其他目录来作为工作区。但为了简单起见,我们采用上面提到的放置方法。

所有 Go 源文件都应该放置在工作区里的 src 目录下。请在刚添加的 go 目录下面创建目录 src。

所有 Go 项目都应该依次在 src 里面设置自己的子目录。我们在 src 里面创建一个目录 GoStudy 来放置整个 hello world 项目。

创建上述目录之后,其目录结构如下:

$GOPATH
├── bin
├── pkg
└── src # 所有Go项目存放的路径
    └── GoStudy

在我们刚刚创建的 GoStudy 目录下,在 index.go 文件里保存下面的程序。

package main

import "fmt"

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

创建该程序之后,其目录结构如下:

$GOPATH
├── bin
├── pkg
└── src
    └── GoStudy
        └── index.go

运行Go文件

  1. 进入GoStudy目录,通过:go run index.go来运行go文件
  2. 通过:go build index.go进行编译,运行生成的可执行文件
go run index.go

go build index.go
./index // 运行编译后的可执行文件,通常直接build后可以执行文件名于项目名一致,通过go build -o xxx 指定文件名

六、入口文件基本代码介绍


使用func main()的文件称为入口函数

package main // 程序首行,必须指明是哪个包 这里表示是main包

import "fmt" // 示导入fmt包 因为Println函数是在fmt包下,主要用于打印

// 在函数外只能声明变量,常量,类型定义等,不能写逻辑代码

func main() { //定义一个main函数 
    fmt.Println("Hello World") //输出 Hello World
}

/*

package main - 每一个 Go 文件都应该在开头进行 package name 的声明。包(Packages)用于代码的封装与重用,这里的包名称是`main`。

import "fmt" - 我们引入了 fmt 包,用于在 main 函数里面打印文本到标准输出。

func main() - main 是一个特殊的函数。整个程序就是从 main 函数开始运行的。main 函数必须放置在 main 包中。{和} 分别表示 main 函数的开始和结束部分。

fmt.Println("Hello World") - fmt 包中的 Println 函数用于把文本写入标准输出。

*/

七、go命令介绍

7.1 基本命令


直接在终端中输入 go help 即可显示所有的 go 命令以及相应命令功能简介,主要有下面这些:

  • build: 编译包和依赖
  • clean: 移除对象文件(go clean :删除编译的可执行文件)
  • doc: 显示包或者符号的文档
  • env: 打印go的环境信息
  • bug: 启动错误报告
  • fix: 运行go tool fix
  • fmt: 运行gofmt进行格式化(go fmt :自动将代码格式)
  • generate: 从processing source生成go文件
  • get: 下载并安装包和依赖(go get github.com/astaxie/beego:下载beego框架)
  • install: 编译并安装包和依赖(go install 项目名:会将go编译,并放到bin路径下)
  • list: 列出包
  • run: 编译并运行go程序
  • test: 运行测试
  • tool: 运行go提供的工具
  • version: 显示go的版本
  • vet: 运行go tool vet

7.2 build 与 run命令


就像其他静态类型语言一样,要执行 go 程序,需要先编译,然后在执行产生的可执行文件。go build 命令就是用来编译 go程序生成可执行文件的。但并不是所以的 go 程序都可以编译生成可执行文件的, 要生成可执行文件,go程序需要满足两个条件:

  • 该go程序需要属于main包
  • 在main包中必须还得包含main函数

也就是说go程序的入口就是 main.main, 即main包下的main函数,如下:

test.go

package main

import "fmt"

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

编译test.go文件成为可执行文件

>>> go build test.go 
>>> ./test # 运行这个可执行文件
Hello World

上面就是 go build 的基本用法,另外如果使用 go build 编译的不是一个可执行程序,而是一个包,那么将不会生成可执行文件。

go run 命令可以将上面两步并为一步执行(不会产生中间文件)。

>>> go run test.go 
Hello World

上面两个命令都是在开发中非常常用的。

此外 go clean 命令,可以用于将清除产生的可执行程序:

go clean    # 不加参数,可以删除当前目录下的所有可执行文件
go clean hello.go  # 会删除与该go文件名相同的可执行文件

7.3 install命令介绍

该命令与build命令较为类似,但其作用分为两部分:

  1. 将编译生成的可执行文件存放到bin目录下
  2. 将编译后的包文件存放到pkg目录下

包:项目下面的文件夹,用于管理不同功能的文件,起到一个分类效果

GoStudy项目里面创建文件夹,那么这个文件夹就是一个包

首先直观的来查看一下installbuild的差异,我们当前的目录结构如下:

$GOPATH
├── bin
├── pkg
└── src
    └── GoStudy
        └── index.go

那么我们在GoStudy项目里面执行go build则会将属于mian包的go文件编译成可执行文件,结果会在当前目录生成一个名称为GoStudy的可执行文件。

而使用go install则会在bin目录下面生成名称为GoStudy的可执行文件,目录结构如下:

$GOPATH
├── bin
│   └── GoStudy
├── pkg
└── src
    └── GoStudy
        └── index.go

我们去到bin目录调用可执行文件结果也是相同的
在这里插入图片描述
此在我们的项目里新增一个test包,创建一个add.go文件,文件内容:

// 标注属于test包,但是我们也可以指定其它的,比如abc,但是不规范,且一个包下面的所有文件必须package保持一致
package test

func AddNum(a ,b int) int{
	return a + b
}

此时的目录结构如下:

$GOPATH
├── bin
│   └── GoStudy
├── pkg
└── src
    └── GoStudy
        ├── index.go
        └── test // 包
            └── add.go

我们进入test包下,执行:go install后,目录结构如下:

$GOPATH
├── bin
│   └── GoStudy
├── pkg
│   └── darwin_amd64
│       └── GoStudy // GoStudy项目的包文件
│           └── test.a
└── src
    └── GoStudy
        ├── index.go
        └── test
            └── add.go

此时我们应该能够理解,go install的命令作用是什么,首先将可执行文件存放到bin目录,其次将编译的包文件存放到pkg目录。

关于包的更多内容,我们将会在下一章节进行详细的理解。


八、命名规范

8.1 变量规范定义


Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:

1、一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线

2、大写字母和小写字母是不同的:Name和name是两个不同的变量

3、关键字和保留字都不建议用作变量名


8.2 关键字


Go语言中关键字有25个;关键字不能用于自定义名字,只能在特定语法结构中使用。

break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var

8.3 保留字


go语言中有37个保留字,主要对应内建的常量、类型和函数

内建常量: true false iota nil

内建类型:  int int8 int16 int32 int64
          uint uint8 uint16 uint32 uint64 uintptr
          float32 float64 complex128 complex64
          bool byte rune string error

内建函数: make len cap new append copy close delete
          complex real imag
          panic recover

8.4 需要注意的问题


  1. 这些保留字并不是关键字,可以在定义中重新使用它们。在一些特殊的场景中重新定义它们也是有意义的,但是也要注意避免过度而引起语义混乱

  2. 如果一个名字是在函数内部定义,那么它就只在函数内部有效。如果是在函数外部定义,那么将在当前包的所有文件中都可以访问。名字的开头字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母开头的(必须是在函数外部定义的包级名字;包级函数名本身也是包级名字),那么它将是导出的,也就是说可以被外部的包访问,例如fmt包的Printf函数就是导出的,可以在fmt包外部访问。包本身的名字一般总是用小写字母

  3. 名字的长度没有逻辑限制,但是Go语言的风格是尽量使用短小的名字,对于局部变量尤其是这样;你会经常看到i之类的短名字,而不是冗长的theLoopIndex命名。通常来说,如果一个名字的作用域比较大,生命周期也比较长,那么用长的名字将会更有意义

  4. 在习惯上,Go语言程序员推荐使用 驼峰式 命名,当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔。因此,在标准库有QuoteRuneToASCII和parseRequestLine这样的函数命名,但是一般不会用quote_rune_to_ASCII和parse_request_line这样的命名。而像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml

  5. go文件的名字,建议用下划线的方式命名(参见go源码)

感谢各位阅读完本篇文章,希望我们能在一起成长的路上追随光、成为光,照亮每一个靠近你的人!我是子夜,能够给您带来好文实属荣幸。

你可能感兴趣的:(Golang精进之路,golang,开发语言,后端)