Go 是否需要使用 getter / setter ? 如果需要,什么情况应该使用?

2016-03-22 21:32:35 +08:00
 darasion
我看大部分情况下是不需要的,但是有时候要给读写的时候加个锁,这时候就貌似必须得有这个了。

如果一个 struct 有了 getter / setter 而其他的没有,就显得很不统一,最后的代码很难看的样子,有时候还记不住哪个有哪个没有了。

这样的问题咋解决?
2073 次点击
所在节点    Go 编程语言
8 条回复
mengzhuo
2016-03-22 21:51:17 +08:00

碰到这样的的说明你的上层接口设计不当
所有需要锁的地方都要用统一的 get set
bcxx
2016-03-22 21:58:40 +08:00
多用 interface ...
elgoog1970
2016-03-22 22:10:27 +08:00
go is not java
zonghua
2016-03-22 22:20:16 +08:00
@elgoog1970 让我又想到了递归命名法, go is not java `ginj`
zyguan
2016-03-22 22:30:44 +08:00
如果你的实现不可避免的存在竞争条件,那加锁也没什么可耻的。而且加锁也不是非要在 getter/setter 上加,别套用 java 的 synchronized ,完全可以在相关逻辑代码中加,如果逻辑复杂多处竞争,那你就真该考虑优化优化设计了。另外,既然用 go ,那还是尽量多用 channel 少用共享可变量吧。
darasion
2016-03-23 09:19:00 +08:00
@mengzhuo 因为不是所有地方都需要,不统一,所以才纠结。

@zyguan 如果我想在内存中保存一个列表,不断的有各路 goroutine 更新它的某些元素, channel 怎么做?
zyguan
2016-03-23 10:55:18 +08:00
@darasion 另开一个 goroutine 专门维护这个列表,其它各路 goroutines 通过 channel 和它通信,这样就没必要加锁了。当然,前提是对这个列表的更新或访问不会频繁到成为瓶颈。实际上,如果成为瓶颈了,即使用锁来同步,也不会好哪去,这时应该考虑对这列表进行分区了。个人愚见,仅供参考。
mengzhuo
2016-03-23 12:09:04 +08:00
@darasion 能用楼上的 Channel 就用,实在用不了再看数量,多的就统一,少的话,业务函数自己上锁。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/265578

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX