go defer执行顺序:先进后出。
Go的异常处理机制——panic和recover的使用和原理
go语言随笔记录——哪些情况可以出现panic错误
一、数组越界
二、空指针
三、类型断言失败(接口转换异常)
四、通道为空,通道已关闭
五、死锁,所有线程睡眠(致命错误)
六、给空map赋值
七、并发的map写
八、递归死循环,堆栈溢出
golang 之select 的高级用法
select有3个特色分别是:
nil的通道永远阻塞
如何跳出for -select 循环
select{} 永远阻塞
channel与等待队列
nil通道永远阻塞
当case上读取一个通道时,如果这个通道是 nil , 则该case 永远阻塞,这个特性我们可以自定义将某个信道强制进行阻塞
func CombineChannel(ch1,ch2 chan int) <-chan int {
out := make(chan int,3)
go func() {
defer close(out)
for {
select {
case v1 , ok := <-ch1:
if !ok {
ch1 = nil
continue
}
out <- v1
case v2 , ok := <-ch2:
if !ok {
ch2 = nil
continue
}
out <- v2
}
if ch1 == nil && ch2 == nil {
break
}
}
}()
return out
}
当我们开发一个程序的时候,main函数千万不能在子协程干完活前退出,不然所有的子协程就都被迫退出了。服务也就被迫停止了。
Go语言中new与make的区别
一 new和make的定义
func new(Type) *Type
func make(t Type, size ...IntegerType) Type
其中Type代表某一个数据类型。
二 两者的区别
2.1 返回值
从定义中可以看出,new返回的是指向Type的指针。 make直接返回的是Type类型值。
2.2 入参
new只有一个Type参数,Type可以是任意类型数据。 make可以有多个参数,其中第一个参数与new的参数相同,但是只能是slice,map,或者chan中的一种。对于不同类型,size参数说明如下:
对于slice,第一个size表示长度,第二个size表示容量,且容量不能小于长度。如果省略第二个size,默认容量等于长度。
对于map,会根据size大小分配资源,以足够存储size个元素。如果省略size,会默认分配一个小的起始size。
对于chan,size表示缓冲区容量。如果省略size,channel为无缓冲channel。