slice map和chan struct make new 作为函数参数分析

go都是值传递。比如数组拷贝,或者把数组赋值给一个变量,拷贝的死数组的副本。新的更改不影响源数组。数组是值类型可以比较。切片是值类型,本身不拥有任何数据,是对现有数组的引用,对切片的修改也会反映到底层数组上。

make和new都不是go的关键字而是预定义的函数。意味着可把make new重新定义为其他类型。make返回一个变量而new返回一个变量的指针,

new返回指向新分配的该类型的地值,不是空指针(nil),new只分配内存,不初始化内存。所谓的初始化就是给类型赋初值,比如字符为空,整型为0, 逻辑值为false等。

make只用于slice  map chan,make返回类型零值的切片,非nil。它返回的就是类型本身,而不是指针类型,因为make只能给slice,map,channel等初始化内存,它们返回的就是引用类型,那么就没必要返回指针了。并且返回一个初始化的(而不是置零)

new返回指针,make返回引用。new分配空间被清零,make分配空间后,会进行初始化。

1.slice是个结构体,而不是一个指针,其底层实现是指向数组的指针

三要素:type(指针),len,cap

函数内部修改slice并不会影响外部slice。 其实go里面都是值传递,makeslice返回的是[]int,传入函数内部会对其拷贝一份,slice内部实现是指向数组的指针的,拷贝的副本部分底层实现也是指向同一内存地址的指针数组所以内部修改slice的值是能修改的,但是append的并没有修改传入的slice的数组,而是返回一个新的slice的,这要去看看slice的实现和其append的扩容机制。实际上当函数内部不扩容slice,如果修改slice也是修改其指向的底层数组。如果发生扩容会发生数据拷贝,并不会修改其指向的array数组。
切片实体初始化为切片类型的零值 nil。一个 nil 切片的长度和容量为 0。切片指针初始化为nil。make返回类型零值的切片,非nil。切片只能和nil作比较,要比较切片需比较切片的每个元素值

2.map makemap返回的是一个指针,底层实现是hashmap,并且使用链地址方法解决hash冲突,扩容方式2倍扩容,渐进式扩容。

make map的时候,编译器调用runtime.makemap,返回的是hmap的指针。

map是线程不安全的,并且还是无序的,至于为什么设计成无序,再补充。

map的零值是nil,不能插入元素。map没有容量的概念,其长度为目前元素的个数。

只要map不为nil就可以无限插入元素。“map[]=”插入元素。

map实体初始化为nil。需要make()或“=map[int]int{}”进行初始化后才能加元素。

map指针初始化为nil。

make返回类型零值的map,且长度为0,无论make中是否指定len或指定len大小。

map只能和nil作比较。要比较map,需比较两个map的每个元素。

3.chan :make chan的时候,会返回hchan类型的指针,因此我们再函数内部操作chan的同事,也会影响函数外的数值。

有缓冲和无缓冲chan的区别,除了无缓冲的缓冲区是1之外,最大的区别是,同步异步的区别,无缓冲的chan,当放入了数据,你不拿,放的人不走。而无缓冲chan就是,如果缓冲区未满,放的人可以放了就走,是异步的。

4.struct 

结构体是值类型,可以直接用=赋值。

结构体实体初始化为每个成员的零值,仅为某些字段指定初始值时,忽略的字段会赋值为零值。

结构体指针值为nil。

new()返回指向类型零值的指针。

如果它的每一个字段都是可比较的,则该结构体也是可比较的。如果两个结构体变量的对应字段相等,则这两个变量也是相等的。如果结构体包含不可比较的字段,则结构体变量也不可比较。

map可以以指针和实体方式返回,函数返回后可以通过返回值访问到原来函数内部的结构体(即函数内部的结构体不会随着函数结束而被回收)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值