[Golang Go语言] 这两段代码怎么选择喔?

发布于 1周前 作者 itying888 来自 Go语言

[Golang Go语言] 这两段代码怎么选择喔?


select {
case l.rConn <- c:
default:
}

if len(l.rConn) < cap(l.rConn) { l.rConn <- c }

16 回复

当然第一个啊
len(chan) 虽然线程安全的,但很少会这么用,原因是当你前一步执行了 len,下一步就不一定是那个数量了

更多关于[Golang Go语言] 这两段代码怎么选择喔?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


当然是第一种,第二种我都看不懂你要做什么。倒立吃饭的感觉

nonblocking send channel ?那肯定是第一种更通用,容易理解

第二非原子操作,是有问题的

主要是考虑到性能问题
BenchmarkSelect-8 82773339 16.42 ns/op 0 B/op 0 allocs/op
BenchmarkLen-8 738067750 1.571 ns/op 0 B/op 0 allocs/op
BenchmarkLenLock-8 35197221 33.51 ns/op 0 B/op 0 allocs/op

而且 l.rConn 只有一处写入,可能有多处读取

就是非阻塞写入,管道没用容量的话会直接丢弃本次数据

第二种不是原子的,两个线程同时判断可能会有一个阻塞

你是不是在 select 或者 if 外包了一层 for 啊?

对的,在一个循环中,只有这一个地方在写入

第二个一眼看不懂。。。第二眼也没看懂。。

这有啥的,就是避免写入阻塞哒

直接让它阻塞在 l.rConn <- c 就好啦,为啥还要 select default 或者 if 来跳过啊。
第二种写法很有可能就会阻塞在 l.rConn <- c 的。

逻辑要求就不能阻塞,丢失数据也不能阻塞。

然后 l.rConn 的写入只有这一处,第二种写法也有阻塞的可能?

像上面说的,if len(l.rConn) < cap(l.rConn) 和 l.rConn <- c 不是原子的,所以有阻塞可能。你要非阻塞只能用上面的 select

能用 switch 就不用 if, Bill Kennedy 的淳淳教诲

在面对两段Go语言代码的选择时,通常需要考虑以下几个关键因素来做出专业判断:

  1. 功能实现:首先确保两段代码都能正确实现所需的功能。如果某段代码存在逻辑错误或无法达到预期效果,那么它显然不是最佳选择。

  2. 性能:对于性能敏感的应用,需要比较两段代码的执行效率。这包括内存占用、CPU使用率以及响应时间等。使用Go的内置工具如pprof进行性能分析可以帮助做出更准确的判断。

  3. 可读性:清晰的代码结构、有意义的变量命名和注释能够提高代码的可读性,便于后续维护和团队协作。选择那些易于理解的代码段。

  4. 健壮性:考虑代码对异常情况的处理,比如错误处理机制、边界条件检查等。健壮的代码能够减少运行时错误和崩溃的风险。

  5. 扩展性:如果代码需要频繁更新或扩展新功能,选择那些模块化设计良好、易于修改和扩展的代码。

  6. 社区支持:如果两段代码涉及第三方库或框架,考虑其社区活跃度、文档质量和维护情况。这些因素会影响你遇到问题时的解决速度和效率。

综上所述,没有固定的答案可以直接告诉你选择哪段代码,而是需要根据具体需求,结合上述因素进行综合评估。如果可能,进行小范围的测试或原型开发也是一个有效的验证方法。

回到顶部