GO 学习

时间:2022-12-12 19:10:21

1 安装

下载:​​https://golang.google.cn/dl/​

配置env


PS H:\testGo> $env:GO111MODULR="on"
PS H:\testGo> $env:GOPROXY="http://goproxy.cn"

添加环境变量 :软件安装在H:\go目录下

GO 学习

 下载git软件

地址​​https://git-scm.com/downloads​

下载好之后将目录添加到环境变量里面

GO 学习

goroot:go项目安装目录

linux安装

GO 学习

GO 学习

2 GO的常用变量

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

  • build: 编译包和依赖
  • clean: 移除对象文件
  • doc: 显示包或者符号的文档
  • env: 打印go的环境信息
  • bug: 启动错误报告
  • fix: 运行go tool fix
  • fmt: 运行gofmt进行格式化
  • generate:从processing source 生成go文件
  • install:编辑并安装包和依赖
  • list:列出包
  • run:编辑并运行go程序
  • test:运行测试
  • tool:运行go提供的工具
  • version:查看go版本

3 golang数组

数组是相同数据类型的一组数据的集合,数组一旦定义 长度不能修改,数组可以通过下标或者是索引来访问元素

数组的定义

var variable_name [size] variable_type
variable_name 数组名称
[size] 数组长度
variable_type 数组保存元素的类型

省略数组长度

数组长度可以省略 使用 ... 代替 初始化值得数量自动推断,例如 var a=[...]int{1,2,3}

var a=[...]int{0:1,5:77}   有6个元素 其中索引1-4默认为0

var a=[...]bool{0:true,4:true}   有6个元素 其中索引1-3默认为false

4 切片

数组是固定长度,可以容纳相同数据类型的元素的集合,当长度固定时,使用带来一些限制,比如申请的长度太大浪费内存,太小又不够使用,

切片可以理解为可变长度的数组,其实他底层就是使用数组实现的增加了自动扩容功能,切片slice是一个拥有相同类型原色的可变长度序列

语法:

var identifier []type
var slice1 []type =make([]type,len) 初始化切片长度
slice1 := make([]type,len) 指定长度
make([]Type,length,capoacity) 指定容量

切片的增加和删除

增加示例:
var s1 =[]int {1,2,3,4,5}
s1 =append(s1,6) //增加

删除 s1[3]
s1 =append(s1[:2],s1[3:]...)

修改
s1[3] =100

切片直接赋值时 指定的是同一个地址

var s1 =[]int{1,2,3}

var s2 = s1 地址传递
var s3 =make([]int,4)
copy(s3,s1) 值传递

5map

使用内建函数make也可以使用关键字map map 是一个无序集合

声明变量 默认map是nil
var map_variable map[key_data_type]value_data_type
使用make函数
map_variable = make(map[key_data-type]value-data_type)

map_variable 变量名称
map[key_data_type] key的数据类型
value_data_type 值的数据类型
示例
var m1 map[string]string{"name":"tom","age":"20"}

示例2
m2 :=make(map[string]string)
m2["name"]="tom"
m2["age"]="20"

v,ok :=m2["email"]
ok标识m2中email 不存在是ok为false 存在时ok返回ture

6 函数

  • go语言有三种函数:普通函数,匿名函数,方法(定义在struct结构体上的函数)
  • 不允许函数重载,也不允许函数同名
  • 不能嵌套函数,单可以嵌套匿名函数
  • 函数是一个值,可以将函数赋值给变量,这个变量也成为了函数
  • 函数可以作为参数传递给另一个函数
  • 函数的返回值可以是一个函数
  • 函数调用的时候,如果有参数传递给函数,则先拷贝参数的副本,再讲副本传递给函数
  • 函数参数可以没有名称

函数再使用之前必须先定义,可以调用函数来完成某个任务,函数可以重复调用,从而达到代码重用

语法

func function_name([parameter list])[return_type]
{
}

7 闭包和递归

闭包
func add() func(int) int {
var x int
return func(y int) int {
x += y
return x
}
}

func main(){
var f =add(10)
f(10)
f(20)
f(30)
}
递归阶乘运算

func jieCheng(a int) int{
if a==1{
return 1
}else{
return a * jiecheng(a-1)
}
}

8 defer 语句 和 init 函数

延迟处理 在defer归属的函数即将返回时,将延迟处理的语句按照defer 定义的逆序进行执行,也就是说先被defer的语句最后被执行,最后被defer的语句最先被执行(先进后出

  1. defer用于注册延迟调用
  2. 调用知道return前才被执行,因此可以用来做资源清理
  3. 多个defer语句,按照先进后出方式zhixng
  4. defer语句中的变了,在defer声明是就决定了

用途:关闭文件句柄,锁资源释放,数据库连接释放

init函数先于main函数执行,实现包级别的初始化操作

特点:

  • init函数先于main函数自动执行,不能被其他函数调用
  • init函数没有输入参数 ,没有返回值
  • 每个包可以有多个init函数
  • 包的每个源文件也可以有多个init函数
  • 同一个包的init执行顺序,golang没有明确定义,编程时注意程序不要依赖这个执行顺序
  • 不同包的init函数按照包导入的依赖关系决定执行顺序

9 指针

定义类型 *

var i :=*int
var a :=100
i=&a 将a的地址给i
var c := int
c =*i 将I的值赋值给c