GO 学习
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GO 学习相关的知识,希望对你有一定的参考价值。
1 安装
下载:https://golang.google.cn/dl/
配置env
PS H:\\testGo> $env:GO111MODULR="on"
PS H:\\testGo> $env:GOPROXY="http://goproxy.cn"
添加环境变量 :软件安装在H:\\go目录下
下载git软件
地址https://git-scm.com/downloads
下载好之后将目录添加到环境变量里面
goroot:go项目安装目录
linux安装
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=[...]int1,2,3
var a=[...]int0:1,5:77 有6个元素 其中索引1-4默认为0
var a=[...]bool0: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 =[]int1,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的语句最先被执行(先进后出)
- defer用于注册延迟调用
- 调用知道return前才被执行,因此可以用来做资源清理
- 多个defer语句,按照先进后出方式zhixng
- 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
以上是关于GO 学习的主要内容,如果未能解决你的问题,请参考以下文章