[Golang Go语言] 这两段代码怎么选择喔?
[Golang Go语言] 这两段代码怎么选择喔?
select {
case l.rConn <- c:
default:
}
if len(l.rConn) < cap(l.rConn) {
l.rConn <- c
}
当然第一个啊
len(chan) 虽然线程安全的,但很少会这么用,原因是当你前一步执行了 len,下一步就不一定是那个数量了
更多关于[Golang Go语言] 这两段代码怎么选择喔?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
当然是第一种,第二种我都看不懂你要做什么。倒立吃饭的感觉
nonblocking send channel ?那肯定是第一种更通用,容易理解
第二非原子操作,是有问题的
就是非阻塞写入,管道没用容量的话会直接丢弃本次数据
第二种不是原子的,两个线程同时判断可能会有一个阻塞
你是不是在 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语言代码的选择时,通常需要考虑以下几个关键因素来做出专业判断:
-
功能实现:首先确保两段代码都能正确实现所需的功能。如果某段代码存在逻辑错误或无法达到预期效果,那么它显然不是最佳选择。
-
性能:对于性能敏感的应用,需要比较两段代码的执行效率。这包括内存占用、CPU使用率以及响应时间等。使用Go的内置工具如
pprof
进行性能分析可以帮助做出更准确的判断。 -
可读性:清晰的代码结构、有意义的变量命名和注释能够提高代码的可读性,便于后续维护和团队协作。选择那些易于理解的代码段。
-
健壮性:考虑代码对异常情况的处理,比如错误处理机制、边界条件检查等。健壮的代码能够减少运行时错误和崩溃的风险。
-
扩展性:如果代码需要频繁更新或扩展新功能,选择那些模块化设计良好、易于修改和扩展的代码。
-
社区支持:如果两段代码涉及第三方库或框架,考虑其社区活跃度、文档质量和维护情况。这些因素会影响你遇到问题时的解决速度和效率。
综上所述,没有固定的答案可以直接告诉你选择哪段代码,而是需要根据具体需求,结合上述因素进行综合评估。如果可能,进行小范围的测试或原型开发也是一个有效的验证方法。