Go 的原生数据类型能够分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func 。
相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有相似C语言的指针这个相对古老的特性。但不一样于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,并且也不能对指针作整数运算。从这一点看,Golang 的指针基本就是一种引用。
那么 Golang 为何须要指针?这种指针又能有什么独特的用途呢?
在学习引用类型语言的时候,老是要先搞清楚,当给一个函数/方法传参的时候,传进去的是值仍是引用。实际上,在大部分引用型语言里,参数为基本类型时,传进去的大都是值,也就是另外复制了一份参数到当前的函数调用栈。参数为高级类型时,传进去的基本都是引用。这个主要是由于虚拟机的内存管理致使的。
内存管理中的内存区域通常包括 heap 和 stack, stack 主要用来存储当前调用栈用到的简单类型数据:string,boolean,int,float 等。这些类型的内存占用小,容易回收,基本上它们的值和指针占用的空间差很少,所以能够直接复制,GC也比较容易作针对性的优化。 复杂的高级类型占用的内存每每相对较大,存储在 heap 中,GC 回收频率相对较低,代价也较大,所以传引用/指针能够避免进行成本较高的复制操做,而且节省内存,提升程序运行效率。
所以,在下列状况能够考虑使用指针:1,须要改变参数的值;2,避免复制操做;3,节省内存;
而在 Golang 中,具体到高级类型 struct,slice,map,也各有不一样。实际上,只有 struct 的使用有点复杂,slice,map,chan 均可以直接使用,不用考虑是值仍是指针。
struct:
对于函数(function),由函数的参数类型指定,传入的参数的类型不对会报错。
对于方法(method),接收者(receiver)能够是指针,也能够是值,Golang 会在传递参数前自动适配以符合参数的类型。也就是:若是方法的参数是值,那么按照传值的方式 ,方法内部对struct的改动没法做用在外部的变量上。
方法是包含了接收者的函数。
函数的格式是固定的,func 函数名 参数 返回值(可选) 函数体。
slice :
slice 实际上至关于对其依附的 array 的引用,它不存储数据,只是对 array 进行描述。所以,修改 slice 中的元素,改变会体如今 array 上,固然也会体如今该 array 的全部 slice 上。
能够使用 make([]int) 来建立并初始化 map 。
map :
使用 make(map[string]string) 返回的自己是个引用,能够直接用来操做。
chan :
make(chan int) 返回的是能够直接使用的 channel 。
func :
在 Golang 中,func 能够做为一种值被返回,所以也能够使用相似 Python 的 decorator 的方式来加工函数。
接口指针:
- 指针的判断,都涉及到type和value。
- 接口指针之间的判等,要基于type与value,一个不一样则不等。
- 接口指针与其对应实现的结构体指针,能够进行判等操做。
------------------------------------------------------------- ------------------------------------------------------------html
数组切片内容复制 copy数组
用于将内容从一个数组切片复制到另外一个数组切片。若是加入的两个数组切片不同大,就会按其中较小的那个数组切片的元素个数进行复制。数据结构
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置
go 源码中 slice 的数据结构定义app
type slice struct {
array unsafe.Pointer
len int
cap int
}
实际go在append的时候放大cap是有规律的。在 cap 小于1024的状况下是每次扩大到 2 * cap ,当大于1024以后就每次扩大到 1.25 * cap 。函数
这个是 slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。post


其中 len 和 cap 就是咱们在调用 len(slice) 和 cap(slice) 返回的值。学习
slice:用来弥补数组的不足,称之为数组切片优化
建立数组切片的方式url
1:基于数组spa
var array [10]int = [10]int{1,2,3,4,5,6,7,8,9,10}
var slice []int = array[:5] //基于数组的前5个元素建立数组切片
2:直接建立
slice := make([]int,5,10) //建立一个初始元素个数为5,初始值为0,并预留10个元素的存储 空间的数组切片
内置函数:
cap():返回数组切片分配的空间大小
len():返回数组切片当前所存储的元素个数