恨死 go 的导出变量命名规则了

2023-08-21 21:25:49 +08:00
 zhwguest

是否包导出居然是靠首字母大小写来区分,写着写着,一个变量想修改为包外可见,居然要修改几十上百个文件。

这是一种什么样的思想....

7872 次点击
所在节点    Go 编程语言
111 条回复
cmdOptionKana
2023-08-21 23:04:13 +08:00
@zhwguest 以 Python 为例,它可能引入一个函数(或直接引入一堆函数),这个函数直接就成为一个本地名称了,也就是说会污染本地变量名,但 Go 引入的是一个包,那个包里的所谓 public 成员,不会直接污染本地名称的,比如引入 fmt, 那么不管 fmt 里面有啥公开成员,都要以 fmt.Print 的形式来使用。

因此,在 Go 里面封装不需要太紧张,污染问题本来就不大。
rekulas
2023-08-21 23:06:18 +08:00
用 go 多年了,从没遇到过你的烦恼,类库一般写下去的之后就能确定它的可见性了,如果经常需要修改你可能要想想是不是前期系统结构考虑不够周到
如果实在不想修改,加一个公共方法把私有成员映射出来也是一个办法,这种做法在各大类库也比较常见,一般都包含私有和公共结构体部分,如果需要操作私有成员的可以通过特定方法进行操作, 直接将私有成员修改为可见也不是一个推荐的方法,可能会导致一些安全问题.
cmdOptionKana
2023-08-21 23:07:33 +08:00
@zhwguest 而且 Go 又不使用 Java 那种传统 OOP 的“继承”关系,因此可见性不需要那么严谨和复杂。
lightjiao
2023-08-22 00:03:35 +08:00
我觉得 golang 在国内之所以火是因为当初 goroutine 实现高并发 IO 的需求很简单,效率也很高
高并发 IO 的需求一度也带热了 Python ( Python 有 asyncio ),但是 Python 一时爽,重构火葬场,Python 很快在 web 领域凉了

尽管如此,golang 还是太简陋了,非常不适用于写业务需求,有地方为了避免变量逃逸甚至会把一个函数写到几千行,完全没必要
同时 goroutine 本身也不是十全十美,它浪费内存已经是众所周知的了

这里推荐感兴趣的了解一下 C# 的 async/await 异步模型,对满足高并发 IO 也非常容易实现,异步之间的通信也不需要 channel 那种额外绕一下的方式,对内存利用率高,运行时得力于 .Net Core 性能越来越好也不再是瓶颈。

C# 早早的实现了跨平台,高级语言也十分特性完备,推荐了解。

注:C# 是 async/await 鼻祖,python 等语言都是从它那里借鉴的
Vegetable
2023-08-22 00:10:55 +08:00
朋友,var A=a ,能看懂吗?
hanxiV2EX
2023-08-22 01:07:50 +08:00
大小写这个还好解决,一个文件夹必须是一个包就很痛苦,没办法把子目录放到一个包下。。。
cooltechbs
2023-08-22 01:35:04 +08:00
一楼正解,加个 getter 完事儿。

我个人写了几年都已经习惯了,反正 Go 的重构工具也很方便,自动修改所有引用基本没有不 work 的。然后改变量名的 PR 单独开一个,不和其他的 feature/bugfix 混在一起。

记得 Go 的定位是 Modern C 吧,语法“简陋”在当下是一股清流,除了 Go 还有其他语言的语法和 C 差不多简单吗
kneo
2023-08-22 01:49:04 +08:00
@cmdOptionKana 你这就属于胡说八道了。
MeteorCat
2023-08-22 01:58:49 +08:00
@cooltechbs Rust ,还支持 bindgen 自动把 c 语言转 rust ,rust 把 go 爆十条街
nuk
2023-08-22 02:10:41 +08:00
据说导出大写是为了可读性,如果是直接导出结构体字段的话,可以加个 get/set
yulon
2023-08-22 02:12:51 +08:00
改名改可见是少数事件,读代码是多数事件
kwanzaa
2023-08-22 02:24:50 +08:00
往好点想,这样可以让你 review 一遍哪里用了它,毕竟你这引用量非常大。
其实挺理解你这种焦躁感的,感觉问题不是出自 golang 身上。
voidmnwzp
2023-08-22 03:25:31 +08:00
@lightjiao 你说 goroutine 浪费内存就有点耍无赖了,一个协程栈最低 4k ,已经比其他编程语言占用低太多了,很多 jvm 都是一次性分配固定 1m ,你用 go 跑一百万个和用 Java 跑一百万个内存占用跟本不是一个量级,后者基本没办法做到,早就 oom 了,你这属于既让马跑又不让马吃草
james122333
2023-08-22 04:38:06 +08:00
一样的好嘛...你其它语言改可视度一样要改全部
不用改那只有原本就用 setter/getter function 才不用改 或着你有用 lombok 导致你有这样的错觉 golang 你照样可以自己写 setter getter
golang 这样虽然丑了点但不是不可以接受 我更喜欢全小写加下划线
james122333
2023-08-22 04:50:24 +08:00
改字段名所有语言都要 refactor name 搂
就算没这功能也很好解决 字段唯一的状况一行指令就搞定了 你如果在 vim 底下用 vimgrep 挑选更改也可以 还可以更快点
dw2693734d
2023-08-22 07:31:52 +08:00
@jorneyr
go 的泛型这个的确是,看着很不舒服
dgqypl
2023-08-22 07:43:15 +08:00
你有发这个帖子的时间拿 IDE 都改完了
kiwi95
2023-08-22 07:45:49 +08:00
情绪这么不稳定还是不要编程了,一个大写导出就“恨死了”,再写下去早晚得抑郁。
Breacher
2023-08-22 07:57:05 +08:00
如果从 private 改成 public ,不也要改几百个文件?
ohwind
2023-08-22 08:34:09 +08:00
@tairan2006 你这逻辑很不可理喻

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

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

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

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

© 2021 V2EX