go channel中的 close注意事项 range取数据

devtools/2024/11/18 8:16:17/

在使用 Go 语言中的 `close` 函数时,有一些注意事项需要牢记,以确保程序的健壮性和正确性:

1. **仅用于通道(channel)**:
   - `close` 函数只能用于关闭通道,不能用于关闭文件、网络连接或其他资源。

2. **关闭的通道不能再发送数据**:
   - 一旦通道被关闭,不能再向该通道发送数据,否则会导致运行时恐慌(panic)。

3. **关闭的通道仍然可以接收数据**:
   - 从已关闭的通道接收数据是安全的。如果通道中有缓冲数据,接收操作将继续直到缓冲区被耗尽。之后,接收操作将返回零值。

4. **避免重复关闭**:
   - 试图关闭已经关闭的通道会导致运行时恐慌(panic)。因此,确保通道只被关闭一次。

5. **关闭责任**:
   - 通道的发送方通常负责关闭通道,而不是接收方。

6. **单向通道**:
   - 不能关闭一个只接收(receive-only)的通道,因为它无法发送数据。

7. **使用 `ok`-idiom 检查通道状态**:
   - 在接收数据时,可以使用 `v, ok := <-ch` 语法检查通道是否已关闭。`ok` 为 `false` 表示通道已关闭。

以下是一个简单的示例,展示如何正确使用 `close`:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 2)

    // 发送数据
    ch <- 1
    ch <- 2

    // 关闭通道
    close(ch)

    // 接收数据
    for v := range ch {
        fmt.Println(v)
    }

    // 检查关闭状态
    if _, ok := <-ch; !ok {
        fmt.Println("通道已关闭")
    }
}
 

通过遵循这些注意事项,可以有效地避免由于不正确使用 `close` 而引起的错误。

使用 range 迭代通道。

当你对一个通道使用 range 时,它会不断从通道中接收值,直到通道被关闭并且通道中的所有值都被接收完毕。

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 3)

    // 向通道发送数据
    go func() {
        for i := 1; i <= 3; i++ {
            ch <- i
        }
        close(ch) // 关闭通道
    }()

    // 使用 range 迭代通道
    for value := range ch {
        fmt.Println(value)
    }

    fmt.Println("通道已关闭,迭代结束")
}
 


http://www.ppmy.cn/devtools/134906.html

相关文章

设计一个设备探测1pv

探测**1 pV&#xff08;皮伏特&#xff0c;&#xff09;的微弱电信号是一个非常具有挑战性但可行的目标。这种极低电压的探测需要超高灵敏度的电路设计和信号处理技术&#xff0c;同时要尽量抑制噪声对信号的干扰。 以下是设计此类设备的一些核心思路和技术方向&#xff1a; …

如何让手机ip变成动态

在数字化浪潮中&#xff0c;手机已成为我们日常生活中不可或缺的一部分。无论是浏览网页、使用社交媒体还是进行在线购物&#xff0c;手机都扮演着举足轻重的角色。然而&#xff0c;在享受网络带来的便利时&#xff0c;我们也需要关注网络安全和隐私保护。静态IP地址可能让手机…

Debezium系列之:Debezium3版本使用快照过程中的指标

Debezium系列之:Debezium3版本使用快照过程中的指标 一、背景二、技术原理三、增量快照四、阻塞快照指标一、背景 使用快照技术的过程中可以观察指标,从而确定快照的进度二、技术原理 Debezium系列之:Debezium 中的增量快照Debezium系列之:Incremental snapshotting设计原理…

[241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%

目录 Debian 12.8 发布Mistral AI 推出批量 API&#xff0c;成本降低 50% Debian 12.8 发布 Debian 项目正式发布了第八个稳定版更新 Debian 12.8 (代号 bookworm)。此次更新主要修复了安全漏洞&#xff0c;并调整了一些严重问题。安全公告已单独发布&#xff0c;并在更新说明…

Python3访问MySQL数据库快速入门Demo

要实现一个简单的IM&#xff08;即时通讯&#xff09;系统&#xff0c;支持用户注册、登录和聊天记录存储&#xff0c;你可以使用Python和mysql数据库。以下是一个基本的实现示例&#xff1a; 要使用MySQL创建表并通过Python提供一个API服务&#xff0c;你可以使用Flask框架来实…

《Probing the 3D Awareness of Visual Foundation Models》论文解析——单图像表面重建

一、论文简介 论文讨论了大规模预训练产生的视觉基础模型在处理任意图像时的强大能力&#xff0c;这些模型不仅能够完成训练任务&#xff0c;其中间表示还对其他视觉任务&#xff08;如检测和分割&#xff09;有用。研究者们提出了一个问题&#xff1a;这些模型是否能够表示物体…

Python自动检测requests所获得html文档的编码

使用chardet库自动检测requests所获得html文档的编码 使用requests和BeautifulSoup库获取某个页面带来的乱码问题 使用requests配合BeautifulSoup库&#xff0c;可以轻松地从网页中提取数据。但是&#xff0c;当网页返回的编码格式与Python默认的编码格式不一致时&#xff0c…

【HOT100第四天】除自身以外数组的乘积,矩阵置零,螺旋矩阵,旋转图像

今天感觉是边界值练习专场。。。整体难度不大但是细节还是需要多动手写一写。 238. 除自身以外的数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意…