下载: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安装
直接在终端中输入go help
即可显示所有的 go 命令以及相应命令功能简介,主要有下面这些:
数组是相同数据类型的一组数据的集合,数组一旦定义长度不能修改,数组可以通过下标或者是索引来访问元素
数组的定义
var variable_name [size] variable_typevariable_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
数组是固定长度,可以容纳相同数据类型的元素的集合,当长度固定时,使用带来一些限制,比如申请的长度太大浪费内存,太小又不够使用,
切片可以理解为可变长度的数组,其实他底层就是使用数组实现的增加了自动扩容功能,切片slice是一个拥有相同类型原色的可变长度序列
语法:
var identifier []typevar 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) 值传递
使用内建函数make也可以使用关键字map map 是一个无序集合
声明变量 默认map是nilvar 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"}示例2m2 :=make(map[string]string)m2["name"]="tom"m2["age"]="20"v,ok :=m2["email"]ok标识m2中email 不存在是ok为false 存在时ok返回ture
函数再使用之前必须先定义,可以调用函数来完成某个任务,函数可以重复调用,从而达到代码重用
语法
func function_name([parameter list])[return_type]{}
闭包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) }}
延迟处理 在defer归属的函数即将返回时,将延迟处理的语句按照defer 定义的逆序进行执行,也就是说先被defer的语句最后被执行,最后被defer的语句最先被执行(先进后出)
defer用于注册延迟调用调用知道return前才被执行,因此可以用来做资源清理多个defer语句,按照先进后出方式zhixngdefer语句中的变了,在defer声明是就决定了用途:关闭文件句柄,锁资源释放,数据库连接释放
init函数先于main函数执行,实现包级别的初始化操作
特点:
init函数先于main函数自动执行,不能被其他函数调用init函数没有输入参数 ,没有返回值每个包可以有多个init函数包的每个源文件也可以有多个init函数同一个包的init执行顺序,golang没有明确定义,编程时注意程序不要依赖这个执行顺序不同包的init函数按照包导入的依赖关系决定执行顺序定义类型 *
var i :=*intvar a :=100i=&a 将a的地址给ivar c := intc =*i 将I的值赋值给c