channel使用法则

Channel操作方式和状态

channel只有三种操作方式

  1. Read
  2. Write
  3. Close

有4种状态

  1. nil
  2. 打开且非空
  3. 打开且空
  4. 关闭的

有三种类型

  1. 只写
  2. 只读
  3. 可读可写

不同的操作对不同状态的channel产生的影响

操作方式Channel状态结果
Readnil阻塞
Read打开且非空输出值
Read打开且空阻塞
Read关闭的 false
Read只写编译错误
Writenil阻塞
Write打开的但填满的阻塞
Write打开且但为填满的写入值
Write关闭的panic
Write只读编译错误
Closenilpanic
Close打开且非空关闭channel,读取成功直到通道耗尽,然后读取默认值
Close打开且空关闭channel,督导生产者的默认任职
Close关闭的panic
Close只读编译错误

怎样避免panic

编译错误我们通过编译器就可以防止了,但是我们怎么能避免panic呢。我们已经知道了panic的出现时机,避免出现这种情况就可以了
panic的三种情况

  1. 写入关闭的channel
  2. 关闭关闭的channel
  3. 关闭为nil的channel

首先我们将channel分为两组,

  1. channel的生成者
    1. 实例化channel
    2. 执行写操作
    3. 关闭channel
    4. 执行以上3点,并通过只读channel将他们暴露出去
  2. channel的消费者
    1. 要知道channel是否关闭了
    2. 正确处理阻塞

示例

package main

import "fmt"

func main() {
	// channel 拥有者
	chOwner := func() <-chan interface{} {
		// 实例化channel
		ch := make(chan interface{})
		go func() {
			// 写入完成后,关闭channel
			defer close(ch)
			for i := 0; i < 10; i++ {
				// 拥有者负责写入
				ch <- i
			}
		}()
		// 将只读channel 返回
		return ch
	}
	chCon := func(ch <-chan interface{}) {
		// 只需要知道channel何时被关闭的即可
		for i := range ch {
			fmt.Println(i)
		}
	}

	ch := chOwner()
	chCon(ch)
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI语言模型,我无法在此回答您的问题。但我可以为您提供一些思路和参考资料。 直方图均衡化、直方图规定化和暗通道先验算法都是图像处理领域中常用的方法,可以用来增强图像的对比度和清晰度等效果。 直方图均衡化主要是通过对图像的灰度直方图进行变换,从而使图像的灰度分布更加均匀,从而达到增强图像对比度的目的。其代码实现如下: ```python import cv2 def histogram_equalization(img): # 将图像转化为灰度图像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算灰度直方图 hist, _ = np.histogram(gray_img.flatten(), 256, [0, 256]) # 计算累积分布函数 cdf = hist.cumsum() # 归一化 cdf_normalized = cdf * hist.max() / cdf.max() # 计算新的灰度值 new_gray_img = np.interp(gray_img.flatten(), np.arange(0, 256), cdf_normalized) # 将新的灰度图像转换为原始图像的形状 new_gray_img = new_gray_img.reshape(gray_img.shape) # 将新的灰度图像转换为彩色图像 new_img = cv2.cvtColor(new_gray_img, cv2.COLOR_GRAY2BGR) return new_img ``` 直方图规定化则是将一个图像的灰度分布转换为另一个图像的灰度分布,从而使它们的灰度分布一致,从而达到增强两个图像的对比度的目的。其代码实现如下: ```python def histogram_specification(img, ref_img): # 将图像转化为灰度图像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ref_gray_img = cv2.cvtColor(ref_img, cv2.COLOR_BGR2GRAY) # 计算灰度直方图 hist, _ = np.histogram(gray_img.flatten(), 256, [0, 256]) ref_hist, _ = np.histogram(ref_gray_img.flatten(), 256, [0, 256]) # 计算累积分布函数 cdf = hist.cumsum() ref_cdf = ref_hist.cumsum() # 归一化 cdf_normalized = cdf * hist.max() / cdf.max() ref_cdf_normalized = ref_cdf * ref_hist.max() / ref_cdf.max() # 计算新的灰度值 new_gray_img = np.interp(gray_img.flatten(), cdf_normalized, ref_cdf_normalized) # 将新的灰度图像转换为原始图像的形状 new_gray_img = new_gray_img.reshape(gray_img.shape) # 将新的灰度图像转换为彩色图像 new_img = cv2.cvtColor(new_gray_img, cv2.COLOR_GRAY2BGR) return new_img ``` 暗通道先验算法则是通过利用图像中的暗通道来估计图像的大气光照,从而去除图像中的雾霾和模糊效果。其代码实现如下: ```python def dark_channel_prior(img, window_size=15): # 将图像转化为灰度图像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算暗通道 dark_channel = np.min(cv2.boxFilter(gray_img, -1, (window_size, window_size), borderType=cv2.BORDER_REFLECT), axis=2) # 估计大气光照 top_n = int(dark_channel.size * 0.001) flat_dark_channel = dark_channel.flatten() flat_dark_channel.sort() atmospheric_light = np.mean(flat_dark_channel[-top_n:]) return atmospheric_light def dehaze(img, window_size=15, t0=0.1, w=0.95): # 估计大气光照 atmospheric_light = dark_channel_prior(img, window_size) # 计算透射率 transmission = 1 - w * np.min(cv2.boxFilter(img / atmospheric_light, -1, (window_size, window_size), borderType=cv2.BORDER_REFLECT), axis=2) transmission = np.maximum(transmission, t0) # 去雾 result = np.zeros_like(img) for i in range(3): result[:, :, i] = (img[:, :, i] - atmospheric_light) / transmission + atmospheric_light result = np.clip(result, 0, 255) return result ``` 以上代码仅供参考,具体实现还需要根据实际需求进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值