Skip to main content

concept

  • 函数是一等公民:那就意味着函数可以做参数,返回值,甚至是struct成员
  • 当程序中有多个defer时,它遵循先入后出的原则,先定义的defer会被压入栈低,最后定义的defer会优先从栈顶弹出
  • interface: 鸭子模型(duck typing)--只要参数中有interface,它就可以被无限扩展/重构. 可能源码用的是鸭子A,我们再造一只鸭子B就好了
  • 无缓冲channel通信是即时的,发完立马能收到,无缓冲channel收发都会阻塞;
  • 关于goroutine,你可以把它想象成人,一个一个的worker,这样代码理解起来也更容易
  • go语言中的函数传参数都是值传递。值传递指的是传递原来数据的一份拷贝而不是原来数据的本身

管道总结

使用管道无需加锁就能保证数据并发的安全, 一个很好的例子 - 用buffer channel来控制worker的数量(worker func外生产,worker func内消费

  • 1.当管道写满了,写阻塞
  • 2.当缓冲区读完了,读阻塞
  • 3.如果管道没有使用make分配空间,管道默认是nil,从nil的管道读取数据,写入数据,都会阻塞(注意,不会崩溃)
  • 4.从一个已经close的管道读取数据时,会返回零值(不会崩溃)
  • 5.向一个已经close的管道写数据时,会崩溃
  • 6.关闭一个已经close的管道,程序会崩溃
  • 7.关闭管道的动作,一定要在写端,不应该放在读端(读的人压根儿不知道管道何时关闭,比如for range),否则写的继续写会崩溃
  • 8.读和写的次数一定要对等,否则:1,在多个goroutine中,资源会泄漏(指多个内层被占用无法回收,而服务器一直是开着的,一旦用户多就会出现内存不够宕机的问题)2.在主协程中,程序崩溃(deadlock)