Go语言基础-常量、列表、函数

栈:
一种拥有特殊规则的线性表数据结构
栈只允许从线性表的同一端放入和取出数据,按照后进先出(LIFO,Last InFirst Out)的顺序
往栈中放入元素的过程叫做入栈。入栈会增加栈的元素数量,最后放入的元素总是位于栈的顶部,最先放入的元素总是位于栈的底部。
从栈中取出元素时,只能从栈顶部取出。取出元素后,栈的元素数量会变少。最先放入的元素总是最后被取出,最后放入的元素总是最先被取出。不允许从栈底获取数据,也不允许对栈成员(除了栈顶部的成员)进行任何查看和修改操作。
栈的原理类似于将书籍一本一本地堆起来。书按顺序一本一本从顶部放入,要取书时只能从顶部一本一本取出
栈用于内存分配 函数结束的时候 声明的变量在栈内就出栈释放内存
堆:
堆用于动态分配和释放程序所使用的对象
堆分配内存和栈分配内存相比,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片
变量逃逸分析:
函数局部变量尽量使用栈,全局变量 结构体成员使用堆分配等,程序员不得不花费很长的时间在不同的项目中学习、记忆这些概念并加以实践和使用。Go语言将这个过程整合到了编译器中,命名为“变量逃逸分析”。通过编译器分析代码的特征和代码的生命周期,决定应该使用堆还是栈来进行内存分配。
go run -gcflags "-m -l " escape.go
闭包
所谓的闭包是指有权访问另一个函数作用域中的变量的函数,就是在一个函数内部创建另一个函数。在Go语言里,所有的匿名函数(Go语言规范中称之为函数字面量)都是闭包。
常量:
Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式
const name[type] = value
显示类型定义: const b string = "abc"
隐式类型定义: const b = "abc"
列表
在Go语言中,列表使用 container/list 包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。
声明初始化:
变量名:= list.New()
通过var关键字声明初始化list
var 变量名 list.List
和map slice array 的不同点:
列表与切片和 map 不同的是,列表并没有具体元素类型的限制,因此,列表的元素可以是任意类型,这既带来了便利,也引来一些问题,例如给列表中放入了一个 interface{} 类型的值,取出值后,如果要将 interface{} 转换为其他类型将会发生宕机。
l:= list.New()
//从前面添加元素
element:=l.PushFront("jack")
//从后面插入元素
l.PushBack(28)
//列表的长度
l.Len();
//在指定元素前添加name元素
InsertBefore("name",element) // 列表元素顺序为 name, jack ,28
//在指定元素后添加sex元素
InsertAfter("sex",element) //// 列表元素顺序为 name,jack,sex,28
l.remove(element) // name ,sex 28
空值nil
布尔初始值为false 数值类型的零值为0 字符串类型的零值为空字符串“” 而指针,切片,映射,通道,函数和接口的零值为nil nil 不等同与 其他语言的null
nil不是关键字或保留字
nil没有默认类型
不同类型的nil的指针是一样的,但是不能进行比较
不同类型的nil值占用的聂村大小可能是不一样的
var p *struct{} 大小为8
fmt.Println(unsafe.Sizeof( c ))
var i interface{} //16
var sl [] int //24
go语言new 和 make 的区别
GO语言中 new 和make是两个内置函数,主要用来创建并分配类型的内存。在定义变量的时候,可能会觉的有点迷惑,不知道应该使用哪个函数来声明,其实他们的规则很简单,new 只分配内存,而make只能用于slice map,channel的初始化
new 函数只接受一个参数,这个参数是一个类型,并且返回一个指向该类型内存地址的指针。 指针指向分配类型的内存地址。同时 new 函数会把分配的内存置为零,也就是类型的零值。
make 也能用来分配内存,但是和new不同,只用于 chan、map、以及slice的内存创建,而它返回的类型就是这三个类型本身,而不是他们额指针类型,因为这三种类型就是引用类型 所以每有必要返回他们的指针了
Go语言中的 new 和 make 主要区别如下:
  • make 只能用来分配及初始化类型为 slice、map、chan 的数据。new 可以分配任意类型的数据;
  • new 分配返回的是指针,即类型 *Type。make 返回引用,即 Type;
  • new 分配的空间被清零。make 分配空间后,会进行初始化;
流程控制的特殊写法
if err := Connect(); err != nil {
  1. fmt.Println(err)
  2. return
  3. }
Connect是一个带有返回值的函数,执行之后将错误保存到err变量中
err !=nil 才是if的判断表达式,当err 不为空时候,打印错误并返回
这种写法可以将返回值与判断放在一行进行处理,而且返回值的作用范围被限制在 if、else 语句组合中。
在编程中,变量的作用范围越小,所造成的问题可能性越小,每一个变量代表一个状态,有状态的地方,状态就会被修改,函数的局部变量只会影响一个函数的执行,但全局变量可能会影响所有代码的执行状态,因此限制变量的作用范围对代码的稳定性有很大的帮助。
函数
函数返回值
如果返回值是同一种类型,则用括号将多个返回值类型括起来,用逗号分隔每个返回值的类型
  1. func typedTwoValues() (int, int) {
  2.     return 1, 2
  3. }
可变参数类型:
可变参数是指函数传入的参数个数是可变的
args...int
形如...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数
它是一个语法糖(syntactic sugar),使用语法糖能够增加程序的可读性,从而减少程序出错的可能。
如果希望传递任意类型,可以指定类型为interface{}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注