&
符号的意思是对变量取地址,如:变量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、函数传递:数组需要明确指定大小,切片不需要。数组是值传递,切片是地址传递
注意slice
和数组在声明时的区别:
声明数组时,方括号内写明了数组的长度或使用...
自动计算长度 。
arr :=[...]
int
{
1
,
2
,
3
,
4
,
5}、arr :=[5]
int
{
1
,
2
,
3
,
4
,
5
}
而声明slice
时,方括号内没有任何字符。
slice := []int{1, 2, 3, 4, 5}、slice:=make([]int,len,cap)
文章参考自: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返回初始化后的(非零)值。)
闭包(Closure)是匿名函数的一个特例。当一个匿名函数所访问的变量定义在函数体的外部时,就称这样的匿名函数为闭包。