go语言中数组与切片的区别

&符号的意思是对变量取地址,如:变量a的地址是&a 

*符号的意思是对指针取值,如:*&a,就是a变量所在地址的值,当然也就是a的值了

*和 & 可以互相抵消,同时注意,*&可以抵消掉,但&*是不可以抵消的 

首先先明白一点:无缓冲=堵塞,缓冲=非堵塞

比如

c1:=make(chan int)        无缓冲

c2:=make(chan int,1)      有缓冲

c1<-1                            

无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着

而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。

打个比喻

无缓冲的  就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。

无缓冲保证信能到你手上

有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。

有缓冲的 保证 信能进你家的邮箱

文章参考自:https://studygolang.com/articles/152

Go语言里面的Comma-ok断言语法可以直接判断是否是该类型的变量: value, ok = element.(T),这里value就是变量的值,ok是一个bool类型,element是interface变量,T是断言的类型。如果element里面确实存储了T类型的数值,那么ok返回true,否则返回false。

go语言中数组与切片的区别

一句话总结:切片是动态数组,注意两者初始化和函数参数的区别

切片是长度可变、容量固定的相同的元素序列。Go语言的切片本质是一个数组。容量固定是因为数组的长度是固定的,切片的容量即隐藏数组的长度。长度可变指的是在数组长度的范围内可变。

1、初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变,切片不需要指定大小 

2、函数传递:数组需要明确指定大小,切片不需要。数组是值传递,切片是地址传递

文章参考自:http://blog.csdn.net/Nick_666/article/details/78640870

地址传递和值传递

值传递只是将变量的内容复制一份而已,函数进行操作的其实是另一个变量,只是另一个变量的值和传递的变量值是相同的。

而地址传递是直接把变量的地址传递给函数,这时函数是直接对原来的变量进行操作的。所以值会变化。

文章参考自:https://zhidao.baidu.com/question/348527211.html

golang的new和make主要区别如下:

1、make只能用来分配及初始化类型为slice,map,chan的数据;new可以分配任意类型的数据

2、new分配返回的是指针,即类型*T;make返回引用,即T;

3、new分配的空间被清零,make分配后,会进行初始化。

(本质来讲,导致这三个内建类型有所不同的原因是:引用在使用前必须被初始化,make初始化了内部的数据结构,填充适当的值。make返回初始化后的(非零)值。)



猜你喜欢

转载自blog.csdn.net/qq_27376871/article/details/79377609
今日推荐