GO 学习

2022-12-12 19:17:18 来源:51CTO博客

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 fixfmt: 运行gofmt进行格式化generate:从processing source 生成go文件install:编辑并安装包和依赖list:列出包run:编辑并运行go程序test:运行测试tool:运行go提供的工具version:查看go版本

3 golang数组

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

数组的定义

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

4切片

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

切片可以理解为可变长度的数组,其实他底层就是使用数组实现的增加了自动扩容功能,切片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)  值传递

5map

使用内建函数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

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语句,按照先进后出方式zhixngdefer语句中的变了,在defer声明是就决定了

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

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

特点:

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

9 指针

定义类型 *

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

标签: 数据类型 可变长度 先进后出

上一篇:零基础开启元宇宙|如何快速创建虚拟形象
下一篇:世界即时看!#yyds干货盘点# LeetCode程序员面试金典:链表相交