4

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

 1 year ago
source link: https://www.v2ex.com/t/967198
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Go 编程语言

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

  zhwguest · 8 小时 7 分钟前 · 1199 次点击

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

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

35 条回复    2023-08-22 04:50:24 +08:00
LonnyWong

LonnyWong      8 小时 5 分钟前

加一个函数不就好了?
lanlanye

lanlanye      7 小时 57 分钟前

你可以学习一下写 Python 的方式,全都大写,内部字段随便加个什么下划线之类的,至于封装到底有没有效果全靠自觉。
lhbc

lhbc      7 小时 57 分钟前

```
func Function() {
function()
}
```
tairan2006

tairan2006      7 小时 55 分钟前 via Android   ❤️ 3

你没有 IDE 么…
zhwguest

zhwguest      7 小时 47 分钟前

ide 就可以不修改文件么?...
函数可以导出结构体的包含关系?...
hsfzxjy

hsfzxjy      7 小时 44 分钟前 via Android

用编辑器的重构功能重命名,会舒服很多,vscode 下直接 F2
darksword21

darksword21      7 小时 42 分钟前 via iPhone

lsp 直接 rename 不就可以了
zhwguest

zhwguest      7 小时 40 分钟前   ❤️ 1

@hsfzxjy 我并不是说改名很麻烦,我其实抱怨的是,如果在定义处用 public/private 等定义的话,只需要修改一处就好了。但是现在这个 public/private 伴随着每个使用它的地方。有十几个文件使用了它,就要修改十几个文件。并不是说麻烦,而是说太不优美了。
hsfzxjy

hsfzxjy      7 小时 31 分钟前 via Android

确实,这点同意
cmdOptionKana

cmdOptionKana      7 小时 27 分钟前

虽然不优雅,但只能算个小缺点,毕竟不是很频繁发生的事情。而且,每种语言要说烦都能找出特别烦的地方,哪有完美哦。
aababc

aababc      7 小时 25 分钟前   ❤️ 1

问就是大道至简
mineralsalt

mineralsalt      7 小时 18 分钟前

我今天也简单看了一下 GO, 确实很多语法很不合理, 完全就是为了和其他语言不同而不同, 根本谈不上优化和好用. 但是交叉编译二进制真的是好用, 真的爽. 如果语法能类似 kotlin 或 ts, 那也会舒服很多啊
zhwguest

zhwguest      7 小时 12 分钟前

@cmdOptionKana 其实一个成员改变包可见性真的是很常见的事情。
hallDrawnel

hallDrawnel      7 小时 10 分钟前

用 IDE 很快就改了,问题不大。能很快改掉的问题都不大。就怕那种改不了的。
crysislinux

crysislinux      7 小时 7 分钟前 via Android   ❤️ 1

确实不太行,一点小事莫名其妙搞个大 pr
teli

teli      6 小时 53 分钟前

如果一个变量,被几十、上百文件引用,这是更大的问题吧
cmdOptionKana

cmdOptionKana      6 小时 45 分钟前

@zhwguest 在 Go 里一般习惯尽量用 public ,只有大概率确定不对外可见的才 private 。

因为,不管任何语言,从 public 改成 private 都肯定麻烦,也极少发生。而 private 改成 public 稍常见一点,那么,一开始不确定的你就一律先 public 嘛,从而把需要改的情形减少了 90%,等到稳定之后再看看,看到一些完全没有外部引用的,此时再从 public 改成 private 也不迟。

如果你按照其他编程语言那一套,优先 private ,那肯定麻烦。
zhwguest

zhwguest      6 小时 42 分钟前

@teli 包内引用一个变量太多次都有问题了.....这算是....一个 student 的 id 还不准包内几十个文件引用?
zhwguest

zhwguest      6 小时 36 分钟前

@cmdOptionKana 你没觉得这样太迁就一个语言了么?就为了一个 Go 的首字母大写,就摒弃了封装性原则,这不正是我吐槽的地方么?
jorneyr

jorneyr      6 小时 30 分钟前

Go 特立独行的地方很多,例如 Json 和 Struct 的属性匹配,泛型大家都用 <T> 而 Go 用 [T],错误没有堆栈信息最后还是要出一个包裹的 error ,更不用说各种 if err != nil 的判断了,特别影响业务逻辑的流畅程度。
cmdOptionKana

cmdOptionKana      6 小时 29 分钟前

@zhwguest 以 Python 为例,它可能引入一个函数(或直接引入一堆函数),这个函数直接就成为一个本地名称了,也就是说会污染本地变量名,但 Go 引入的是一个包,那个包里的所谓 public 成员,不会直接污染本地名称的,比如引入 fmt, 那么不管 fmt 里面有啥公开成员,都要以 fmt.Print 的形式来使用。

因此,在 Go 里面封装不需要太紧张,污染问题本来就不大。
rekulas

rekulas      6 小时 27 分钟前

用 go 多年了,从没遇到过你的烦恼,类库一般写下去的之后就能确定它的可见性了,如果经常需要修改你可能要想想是不是前期系统结构考虑不够周到
如果实在不想修改,加一个公共方法把私有成员映射出来也是一个办法,这种做法在各大类库也比较常见,一般都包含私有和公共结构体部分,如果需要操作私有成员的可以通过特定方法进行操作, 直接将私有成员修改为可见也不是一个推荐的方法,可能会导致一些安全问题.
cmdOptionKana

cmdOptionKana      6 小时 25 分钟前

@zhwguest 而且 Go 又不使用 Java 那种传统 OOP 的“继承”关系,因此可见性不需要那么严谨和复杂。
lightjiao

lightjiao      5 小时 29 分钟前   ❤️ 1

我觉得 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

Vegetable      5 小时 22 分钟前

朋友,var A=a ,能看懂吗?
hanxiV2EX

hanxiV2EX      4 小时 25 分钟前 via Android

大小写这个还好解决,一个文件夹必须是一个包就很痛苦,没办法把子目录放到一个包下。。。
cooltechbs

cooltechbs      3 小时 58 分钟前

一楼正解,加个 getter 完事儿。

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

记得 Go 的定位是 Modern C 吧,语法“简陋”在当下是一股清流,除了 Go 还有其他语言的语法和 C 差不多简单吗
kneo

kneo      3 小时 44 分钟前 via Android

@cmdOptionKana 你这就属于胡说八道了。
MeteorCat

MeteorCat      3 小时 34 分钟前 via Android

@cooltechbs Rust ,还支持 bindgen 自动把 c 语言转 rust ,rust 把 go 爆十条街
nuk

nuk      3 小时 22 分钟前

据说导出大写是为了可读性,如果是直接导出结构体字段的话,可以加个 get/set
yulon

yulon      3 小时 20 分钟前

改名改可见是少数事件,读代码是多数事件
kwanzaa

kwanzaa      3 小时 8 分钟前

往好点想,这样可以让你 review 一遍哪里用了它,毕竟你这引用量非常大。
其实挺理解你这种焦躁感的,感觉问题不是出自 golang 身上。
voidmnwzp

voidmnwzp      2 小时 7 分钟前 via iPhone

@lightjiao 你说 goroutine 浪费内存就有点耍无赖了,一个协程栈最低 4k ,已经比其他编程语言占用低太多了,很多 jvm 都是一次性分配固定 1m ,你用 go 跑一百万个和用 Java 跑一百万个内存占用跟本不是一个量级,后者基本没办法做到,早就 oom 了,你这属于既让马跑又不让马吃草
james122333

james122333      55 分钟前 via Android

一样的好嘛...你其它语言改可视度一样要改全部
不用改那只有原本就用 setter/getter function 才不用改 或着你有用 lombok 导致你有这样的错觉 golang 你照样可以自己写 setter getter
golang 这样虽然丑了点但不是不可以接受 我更喜欢全小写加下划线
james122333

james122333      43 分钟前 via Android

改字段名所有语言都要 refactor name 搂
就算没这功能也很好解决 字段唯一的状况一行指令就搞定了 你如果在 vim 底下用 vimgrep 挑选更改也可以 还可以更快点

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK