Go语言
1.配置环境变量
GOPATH 加路径
GOROOT 加路径
修改环境变量
Setx GOPATH 加要修改的路径
Setx GOROOT 加要修改的路径
两个重要的配置修改
$env:GO111MODULE=”on”
$env:GOPROXY=”http://goproxy.cn"
2.Go相关命令
build: 编译包和依赖
clean: 移除对象文件
doc: 显示包或者符号的文档
env: 打印go的环境信息
bug: 启动错误报告
fix: 运行gofmt进行格式化
generate: 从processing source生成go文件
get: 下载并安装包和依赖
install: 编译并安装包和依赖
list: 列出包
run: 编译并运行go程序
test:运行测试
tool: 运行go提供的工具
version: 显示go的版本
vet: 运行go tool vet
常用快捷键
CTRL+ / 行注释
shift+alt+a 块注释
ctrl + a 全选
ctrl+ c 复制
ctrl+v 粘贴
ctrl+shift+k 删除行
ctrl+e 查找文件
ctrl+shift+p 打开设置命令行
快速生成代码片段
pkgm main包+main主函数
ff fmt.Printf(“”, var)
for for i := 0; 1 < count; i++{}
Go 常见的格式化指令表示
格式化指令 含义
%% %字面量
%b 一个二进制整数,将一个整数格式转化为二进制的表达方式
%c 一个Unicode的字符
%d 十进制整数
%o 八进制整数
%x 小写的十六进制数值
%X 大写的十六进制数值
%U 一个Unicode表示法表示的整型码值
%s 输出以原生的UTF8字节表示的字符,如果console不支持utf8编码,则会乱码
%t 以true或者false的方式输出布尔值
%v 使用默认格式输出值,或者如果方法存在,则使用类性值的String()方法输出自定义值
%T 输出值的类型
golang变量
变量是计算机语言中能储存计算结果或表示值的概念
声明变量必须使用
声明变量的语法
1 | var identifier type |
var:声明变量关键字
identifier: 变量名称
type: 变量类型
变量的初始化
var 变量名 类型 = 表达式
var name string = “张三”
初始化多个变量
var name, age,gender = “张三” ,20 , “男”
短变量声明 :=
在函数内部,可以使用 := 运算符对变量进行声明和初始化
golang常量
定义一个常量使用const关键字,语法格式如下
1 | const constantName [type] = value |
const: 定义常量的关键字
constantName: 常量名称
type: 常量类型
value: 常量的值
常量 iota
一个可编译器修改的常量,它的默认开始值是0,每调用一次加1
遇到const关键字设为0
golang语言数据类型
go数据类型用于声明函数和变量
数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存
1.布尔型 值通常是false和true 例如 var b bool = true
2.数字类型 整型int 和浮点型 float32 、float64 ,并且支持复数,其中位的运算采用补码
3.字符串类型 字符串就是一串固定长度的字符连接起来的字符序列,go的字符串是由单个字节连接起来的 ,字节使用UTF-8编码标识Unicode文本
4.派生类型
a,指针类型(Pointer)
b,数组类型
c,结构化类型(struct)
d,Channel类型
e,函数类型
f,切片类型
g,接口类型(interface)
h,Map类型
golang标识符
标识符的英文是identifer, 通俗来讲就是给变量、常量、函数、方法、结构体、数组、切片、接口起名字。
标识符的组成
- 标识符由数字、字母、和下划线(…)组成
- 只能以字母和下划线开头
- 标识符区分大小写
golang语言关键字
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
预定义标识符
分为基本类型的名称和基本的内置函数
append[添加] bool byte cap close complex[复杂] complex64 complex128 uint16
copy false float32 float64 imag int int8 int16 uint32
int32 int64 iota[极微小] len make new nil[零] panic[恐慌] uint64
print println real recover[恢复] string true uint uint8 uintptr[方法、指针]
go数字类型
整形:
int8(-128->127)
int16(-32768->32767)
int32(-2,147,483,648->2,147,483,647)
golang字符串
一个Go语言字符串是一个任意 字节的常量序列
go语言字符串字面量
字符串字面量使用双引号 “”或者反引号 ‘ 来创建。双引号用来创建可解析的字符串,支持转义,但不能用来引用多行,反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。双引号创建可解析的字符串应用最广泛,反引号用来创建原生的字符串则多用于书写多行消息,HTML以及正则表达式。
go语言字符转义字符
\r | 回车符 |
---|---|
\n | 换行符 |
\t | 制表符 |
' | 单引号 |
" | 双引号 |
\ | 反斜杠 |
golang运算符
1.算术运算符
2.关系运算符
3.逻辑运算符
4.位运算符
5.赋值运算符
注意:++(自增) –(自减)在go是单独语句,并不是运算符
golang语言中语法
if else if else语句
if 布尔表达式1 {
} else if 布尔表达式2 {
}else{
}
switch语句
switch var1{
case val1
…
case val2
…
default:
…
}
for语句
for 初始语句; 条件表达式; 结束语句{
循环语句体
}
for range循环
Go语言中可以使用for range遍历数组、切片、字符串、map及通道(channel),通过for range遍历的返回值有以下规律:
1、数组、切片、字符串返回索引和值
2、map返回键和值
3、通道(channel)只返回通道内的值
golang数组
数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标(或者叫索引)访问元素。
golang语言数组的定义
定义如下:
1 | var variable_name [SIZE] variable_type |
variable_name: 数组名称
SIZE: 数组长度,必须是常量
variable_type: 数组保存元素的类型
golang切片
前面我们学习了数组,数组是固定长度,可以容纳相同数据类型的元素的集合。当长度固定时,使用还是带来一些限制,比如:我们申请的长度太大浪费内存,太小又不够用。
鉴于上述原因,我们有了go语言的切片,可以把切片理解为,可变长度的数组,其实它底层就是使用数组实现的,增加了自动扩容功能,切片(slice)是一个拥有相同类型元素的可变长度的序列。
go语言切片的语法
声明一个切片和声明一个数组类似,只要不添加长度就可以了
1 | var identifer []type |
切片是引用类型,可以使用make函数来创建切片:
1 | var slice1 []type = make([]type, len) |
简写为:
1 | slice1 := make([]type, len) |
也可以指定容量,其中capacity为可选参数
1 | make([]T, length, capacity) |
这里len是数组的长度并且也是切片的初始长度。
golang map
map是一种key:value键值对的数据结构容器,map内部实现是哈希表hash。
map最重要的一点是通过key来快速检索数据,指向数据的值。
map是引用类型的。
map语法
可以使用内建函数make也可以使用map关键字来定义map
1 | var map_variable map[key_data_type]value_data_type |
map_variable: map的变量名称
key_data_type: key的数据类型
value_data_type: 值的数据类型
golang函数
golang函数介绍
函数的go语言中的一级公民,我们把所有的功能单元都定义在函数中,可以重复使用,函数包含函数的名称、参数列表和返回值类型,这些构成了函数的签名(signature)。
go语言中函数特性
1.go语言中有3种函数,普通函数,匿名函数(没有名称的函数)、方法(定义在struct上的函数)。
2.go语言中不允许函数重载(overload),也就是说不允许函数同名。
3.go语言中的函数不能嵌套函数,但可以嵌套匿名函数。
4.函数是一个值,可以将函数赋值给变量,使得这个变量也成为函数。
5.函数可以作为参数传递给另一个函数。
6.函数的返回值可以是一个函数。
7.函数调用的时候,如果有参数传递给函数,则先拷贝参数的副本,再将副本传递给函数。
8.函数可以没有名称。
go语言中的函数的定义和调用
函数在使用之前必须先定义,可以调用函数来完成某个任务。函数可以重复调用,从而达到代码重用。
go语言函数定义语法
1 | func name ([parameter list] [return_type]){ |
语法解析
func: 函数由func开始声明
name: 函数名称,函数名和参数列表一起构成函数签名。
[parameter list] : 参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数,参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不含参数。
[return_type]:返回类型 ,函数返回一列值。
golang函数类型与函数变量
可以使用type关键字来定义一个函数类型,语法格式如下:
1 | type fun func(int, int) int |
上面语句定义了一个fun函数类型,它是一种函数类型,这种函数接收两个int类型的参数并且返回一个int类型的返回值。
golang高阶函数
go语言的函数,可以作为函数的参数,传递给另外一个函数,作为另外一个函数的返回值返回。
golang匿名函数
go语言函数不能嵌套,但是在函数内部可以定义匿名函数,实现一下简单功能调用。
所谓匿名函数就是,没有名称的函数。
语法格式如下:
1 | func (参数列表)(返回值) |
当然可以没有参数,可以没有返回值
golang闭包
闭包可以理解应定义在一个函数内部的函数。在本质上,闭包是将函数外部连接起来的桥梁,或者说是函数和其引用环境的组合体。
闭包指的是一个函数和与其相关的引用环境组合而成的实体,简单来说,闭包=函数+引用环境
golang递归
函数内部调用函数自身的函数称为递归函数。
使用递归函数最重要的三点:
1.递归就是自己调用自己。
2.必须先定义函数的退出条件,没有退出条件,递归将成为死循环。
3.go语言递归函数很有可能会产生一大堆的goroutine, 也很可能会出现栈空间内存溢出问题。
golang结构
Go 中的结构也是一种数据结构,它可包含零个或多个任意类型的字段,并将它们表示为单个实体。
声明结构,使用struct关键字
结构嵌入
通过 Go 中的结构,可将某结构嵌入到另一结构中。 有时,你需要减少重复并重用一种常见的结构。
golang defer语句
go语言中的defer语句会将其后面跟随的语句进行延迟处理,在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。
defer特性
1.关键字defer用于注册延迟调用
2.这些调用直到return前才被执行,因此,可以用来做资源清理
3.多个defer语句,按先进后出方式执行
4.defer语句中的变量,在defer声明时就决定了
defer用途
1.关闭文件句柄
2.锁资源释放
3.数据库连接释放
golang init函数
golang有一个特殊的函数init函数,先于main函数执行,实现包级别的一些初始化操作。
init函数的主要特点
init函数先于main函数自动执行,不能被其他函数调用;
init函数没有输入参数、返回值;
每个包可以有多个init函数;
包的每个源文件也可以有多个init函数,这点比较特殊;
同一个包的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
不同包的init函数按照包导入的依赖关系执行顺序。
golang初始化顺序
初始化顺序:变量初始化->init()->main()
golang指针
Go语言中的函数传参都是拷贝,当我们想要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无须拷贝数据。
类型指针不能进行偏移和运算。
Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和 *(根据地址取值)。
指针地址和指针类型
每个变量在运行时都有拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量进行取地址操作。Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:int 、 * int64、string等。
指针语法
一个指针变量指向了一个值的内存地址。(也就是我们声明了一个指针之后,可以像变量赋值一样,把一个值的内存地址放入到指针当中。)
类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
1 | var var_name *var-type |
var-type: 为指针类型
var_name: 为指针变量名
*:用于指定变量是作为一个指针。