chan和goroutine泄露

本文深入讲解了Go语言中chan的基本概念、类型、操作方法及注意事项,涵盖了无缓冲通道、单向通道、缓冲通道等内容,并通过实例展示了goroutine泄露的常见场景及防范措施。
go chan
chan 类型
  • <发送/写>型 chan<-
  • <接收/读>型 <-chan
  • 双向型 chan
chan 操作
  • 构造/初始化 make()
  • 关闭 close()
  • 判等 ==
  • <发送/写>数据 chan <- send_data
  • <接收/读>数据 recv_data := <- chan
  • chan 关闭或有数据,读操作不阻塞
  • chan 未关闭且无数据,读操作阻塞
package main

import "fmt"

func main() {
   
   

    //双向型 chan, 零值 nil
    var ch chan int
    //输入型 chan->
    var ci chan<- int
    //输出型 <-chan
    var co <-chan int
    //make()
    cc := make(chan int)//无缓冲通道
    cc = make(chan int, 10)//容量为10的通道
    ch = cc
    //双向型赋值给单向型正确
    ci = ch
    co = ch
    //单向型赋值给双向型错误
    //ch = ci //❌
    //ch = co //❌
    fmt.Println(ci, co, ch) //0xc00008c000 0xc00008c000 0xc00008c000

    //可以赋值 -> 类型兼容 -> 可以判等
    b1 := ch == cc
    b2 := ci == nil
    b3 := ch == ci
    b4 := ch == co
    //不可以赋值 -> 类型不兼容 -> 不可以判等
    // b5 := ci == co //❌
    fmt.Println(ci, co, cc, ch) //0xc00008c000 0xc00008c000 0xc00008c000 0xc00008c00
    fmt.Println(b1, b2, b3, b4) //true false true true

    //chan 发送/写
    ch <- 1
    //chan 接收/读
    out := <-ch
    fmt.Println(out) // 1

    ch <- 1
    //close(), chan 关闭
    close(ch) //关闭后读操作不阻塞
    //chan 关闭后,还有数据.读操作,返回 数据 和 true
    out1, ok1 := <-ch
    //chan 关闭后,没有数据.读操作,返回 零值 和 false
    out2, ok2 := <-ch
    fmt.Println(out1, ok1, out2, ok2) // 1 true 0 fals

    ch = make(chan int, 0)
    //chan 没关闭,无数据,读操作阻塞
    out = <-ch

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值