1. Go语言简介
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
Go语言介绍、历史
Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年最佳语言”。
Go语言 vs C语言
Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。
在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。
Go语言 vs C++语言
Go语言与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。
Go 2.0版本将支持泛型,对于断言的存在,则持负面态度,同时也为自己不提供类型继承来辩护。
Go语言 vs Java语言
不同于Java,Go内嵌了关联数组(也称为哈希表 Hashes 或字典 Dictionaries),就像字符串类型一样。
Go语言应用领域
服务器编程、开发云平台、区块链、分布式系统、网络编程
Go语言编译器
当前有两个Go编译器分支,分别为官方编译器gc和gccgo。官方编译器在初期使用C写成,后用Go重写从而实现自举。Gccgo是一个使用标准GCC作为后端的Go编译器。
官方编译器支持跨平台编译(但不支持CGO),允许将源代码编译为可在目标系统、架构上执行的二进制文件。
2. Go语言安装开发环境
下载安装并配置环境变量:下载地址:https://golang.google.cn/dl/
这里注意,安装路径选择一个比较好找的路径,例如:E:\Environment\go,其他安装都选择”下一步“即可。
配置 go 语言环境变量
安装完成后,把E:\Environment\go\bin
目录添加到环境变量,这里就可以使用go了。
如果采用exe模式安装go语言的环境,是会自动配置环境变量的。
测试本地安装go版本
在命令行输入 go version 查看版本,输出结果如下所示。
C:\Users\HP>go version
go version go1.19.5 windows/amd64
go.exe 编译器 commands 命令参数
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
work workspace 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
go 环境 env 配置
go env -json:将环境变量键值对以json形式进行展示
C:\Users\HP>go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\HP\AppData\Local\go-build
set GOENV=C:\Users\HP\AppData\Roaming\go\env
······
go 语言 env 变量
env 变量 | 变量说明 |
---|---|
GO111MODULE | module模式开启,在包管理那篇文章有提到 |
GOBIN | 当我们使用go install命令编译和打包应用程序时,该命令会将编译后二进制程序打包GOBIN目录,一般我们将GOBIN设置为GOPATH下的bin目录 |
GOPATH | 表示go的工作目录,这个目录指定了需要从哪个地方寻找GO的包、可执行程序等 |
GOCACHE | go缓存目录,可以使用 go clean -cache 清空,如果目录变得很大的话 |
GOENV | GO全局环境变量 |
GOMODCACHE | go mod进行包管理时的缓存目录,一般为GOPATH下的pkg下的mod目录,在包管理那篇文章有提到 |
GOOS | 当前操作系统 |
GOROOT | Go语言的安装目录 |
GOPROXY | 代理,在包管理那篇文章有提到 |
GOPRIVATE | go get通过代理服务拉取私有仓库(企业内部module或托管站点上的private库),而代理服务不可能访问到私有仓库,会出现了404错误,于是go1.13后有了这个变量设置 |
GOTOOLDIR | GO工具的安装目录,有cgo.exe等 |
GOVERSION | go的版本号 |
配置 Proxy 代理配置(阿里)
由于国内的网络环境,我们可以通过配置GOPROXY避免DNS污染导致的模块拉取缓慢或失败的问题,加速你的构建。
# Windows
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/
# macOS 或 Linux
export GOPROXY=https://mirrors.aliyun.com/goproxy/
3. Goland开发者工具
开发者工具 Tool
链接:https://www.jetbrains.com/zh-cn/go/download/#section=windows
Goland 2023 Special Anniversary Edition
go 语言程序案例 hello world
package main
import "fmt"
func main() {
fmt.Printf("hello world")
}
运行结果:
GOROOT=E:\Environment\go #gosetup
GOPATH=C:\Users\HP\go #gosetup
E:\Environment\go\bin\go.exe build -o C:\Users\HP\AppData\Local\Temp\GoLand\___go_build_main_go.exe C:\Users\HP\GolandProjects\awesomeProject\main.go #gosetup
C:\Users\HP\AppData\Local\Temp\GoLand\___go_build_main_go.exe
hello world
Process finished with the exit code 0
vscode 安装 go
Windows平台按下 Ctrl+Shift+P,我们在这个输入框中输入>go:install,下面会自动搜索相关命令,我们选择Go:Install/Update Tools这个命令,然后安装所有的依赖包。
安装需要一定的时间,安装完之后重启即可。
main.go:1:1: expected ‘package’, found ‘EOF’
解决方案:按 ctrl+s 保存即可,要在编辑文本 按ctr+s
Vscode 快捷键
4. Go语言新建项目
早期的go项目使用gopath来管理项目,不方便而且容易出错,从golang 1.11 开始使用gomod管理项目,当然还有第三方模块例如govendor
go mod init mypro
基本流程:1.创建项目 2.初始化项目 3.创建包 4.创建模块 5.相互调用
go mod init 初始化
PS C:\Users\HP\Desktop\字节跳动Go语言\basic_learn_go> go mod init mypro
go: creating new go.mod: module mypro
go: to add module requirements and sums:
go mod tidy
Go 语言基本组成说明
属性 | 说明 |
---|---|
包声明 | 编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main。 |
引入包 | 其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。 |
函数 | 和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。 |
变量 | Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。 |
语句 / 表达式 | 在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。 |
注释 | 和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。 |
需要注意的是:标识符是用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母和数字、下划线_组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
使用 build 生成可执行exe文件
go build ./main.go
5. Go语言变量、常量
声明变量的一般形式是使用 var 关键字,具体格式为:var identifier typename
。
如下的代码中我们定义了一个类型为int的变量。
package main
import "fmt"
func main() {
var a int = 27
fmt.Println(a);
}
变量数据类型说明
在 Go 编程语言中,数据类型用于声明函数和变量。
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。具体分类如下:
类型 | 详解 |
---|---|
布尔型 | 布尔型的值只可以是常量 true 或者 false。 |
数字类型 | 整型 int 和浮点型 float。Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。 |
字符串类型 | 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。 |
派生类型 | 指针类型(Pointer)、数组类型、结构化类型(struct)、Channel 类型、函数类型、切片类型、接口类型(interface)、Map 类型 |
在go语言中定义了一个变量,指定变量类型,如果没有初始化,则变量默认为零值。零值就是变量没有做初始化时系统默认设置的值。
数值类型 0、布尔类型 false、字符串 “”(空字符串)
变量没有指定类型
在go语言中如果没有指定变量类型,可以通过变量的初始值来判断变量类型。如下代码
package main
import "fmt"
func main() {
var d = true
fmt.Println(d)
}
可以同时声明多个类型相同的变量(非全局变量),如下图所示:
var x, y int
var c, d int = 1, 2
g, h := 123, "hello"
关于全局变量的声明
var ( vname1 v_type1 vname2 v_type2 )
具体举例如下:
var (
a int
b bool
)
匿名变量
匿名变量的特点是一个下画线_,这本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。
使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
func GetData() (int, int) {
return 10, 20
}
func main(){
a, _ := GetData()
_, b := GetData()
fmt.Println(a, b)
}
iota常量
iota比较特殊,可以被认为是一个可被编译器修改的常量,它默认开始值是0,每调用一次加1。遇到const关键字时被重置为0。
Golang中没有枚举类型,不像Java或Python中有Enum类可以实现枚举,所以Golang通过 const来实现枚举。
变量作用域
作用域指的是已声明的标识符所表示的常量、类型、函数或者包在源代码中的作用范围,在此我们主要看一下go中变量的作用域,根据变量定义位置的不同,可以分为一下三个类型:
函数内定义的变量为局部变量,这种局部变量的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。这种变量在存在于函数被调用时,销毁于函数调用结束后。
函数外定义的变量为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,甚至可以使用import引入外部包来使用。全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。
函数定义中的变量成为形式参数,定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。形式参数会作为函数的局部变量来使用。
Go语言基本的数据类型
以上就是go语言基本的数据类型,有了数据类型,我们就可以使用这些类型来定义变量,Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
6. Go语言结构体
声明结构体
在声明结构体之前我们首先需要定义一个结构体类型,这需要使用type和struct,type用于设定结构体的名称,struct用于定义一个新的数据类型。具体结构如下:
type struct_variable_type struct {
member definition
member definition
...
member definition
}
定义好了结构体类型,我们就可以使用该结构体声明这样一个结构体变量,语法如下:
variable_name := structure_variable_type {value1, value2...valuen}
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}
访问结构体成员
如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体变量名.成员名。举例代码如下:
package main
import "fmt"
type Books struct {
title string
author string
}
func main() {
var book1 Books
Book1.title = "Go 语言入门"
Book1.author = "mars.hao"
}