make和new
1.make和new 01.make和new 1.1 make和new比较 new 和 make 是两个内置函数,主要用来创建并分配类型的内存。 make和new区别 make 关键字的作用是创建于 slice、map 和 channel 等内置的数据结构 new 的作用是为类型申请一片内存空间,并返回指向这片内存的指针 123456789101112package mainimport "fmt"func main() { a := make([]int, 3, 10) // 切片长度为 1,预留空间长度为 10 a = append(a,1) fmt.Printf("%v--%T \n",a,a) // [0 0 0]--[]int 值----切片本身 var b = new([]int) //b = b.append(b,2) // 返回的是内存指针,所以不能直接 append *b = append(*b, 3) // 必须通过 * 指针取值,才能进行 app...
pointer
01.pointer 01.pointer 1.1 什么是pointer 在Go里面pointer就是1种可以把内存地址存储起来的数据类型。 我们使用pointer数据类型的变量可以记录下另1个变量的内存地址,方便我们修改这变量的值。 只需要记住以下几点: &变量名: 获取变量的内存地址 *pointor:通过指针类型的变量,获取该指针指向的值 12345678910package mainimport "fmt"func main() { name := "张三" p1 := &name // &变量名: 获取变量的内存地址 p2 := *&name // *pointor:通过指针类型的变量,获取该指针指向的值 fmt.Println(name,p1,p2) // 张三 0xc000088230 张三} 1.2 为什么Go中使用了指针? 因为指针可以帮助我们节省内存,我们知道在程序运行时值类型的变量被赋值之后会对值进行重新拷贝 如果我们每...
interface
1.interface 01.interface 1.1 interface作用 接口是 Go 语言的重要组成部分,它在 Go 语言中通过一组方法指定了一个对象的行为 接口 interface 的引入能够让我们在 Go 语言更好地组织并写出易于测试的代码 golang中的接口分为 1带方法的接口和空接口 iface:表示带方法的接口 eface:表示空接口 1.2 eface空接口 空接口eface结构比较简单,由两个属性构成 一个是类型信息_type,一个是数据信息 其数据结构声明如下: 1234type eface struct { _type *_type data unsafe.Pointer} 其中_type是GO语言中所有类型的公共描述,Go语言几乎所有的数据结构都可以抽象成 _type,是所有类型的公共描述 type负责决定data应该如何解释和操作 type的结构代码如下: 12345678910111213141516type _type struct { size uintptr ...
Channel
1.channel 01.channel的整体结构图 1.1 channel结构图 channel本质是一个hchan这个结构体 12345678type hchan struct { buf unsafe.Pointer // points to an array of dataqsiz elements sendx uint // send index recvx uint // receive index recvq waitq // list of recv waiters sendq waitq // list of send waiters lock mutex} 简单说明: buf是有缓冲的channel所特有的结构,用来存储缓存数据,是个循环链表 sendx 123和 recvx 123用于记录 buf 123456789 这个循环链表中的~发送或者接收的~index - `recvx`和`sendx`是根据循环链表`buf`的变动而改变的- ...
数组与切片
1.数组与切片 01.数组 1.1 数组 数组是一种非常有用的数据结构,因为其占用的内存是连续分配的。 由于内存连续,CPU能把正在使用的数据缓存更久的时间。 而且内存连续很容易计算索引,可以快速迭代数组里的所有元素。 golang中声明数组需要告诉数组长度,以及存放数据类型 一旦初始化成功,那么存储的数据类型和数组长度就都不能改变了 xxxxxxxxxx package mainimport "fmt"func main() { SliceShallowCopy() SliceDeepCopy()}func SliceShallowCopy() { src := []byte {1,2,3,4,5,6} dst := src fmt.Println(“浅拷贝原始数据”,src) // [1 2 3 4 5 6] dst[0]=10 // 修改拷贝数据,原始数据会以前跟着改变 fmt.Println(“after modify[src]:”,src) // [10 2 3 4 5 6]}func S...