在Golang中使用“ this”


12

对于Golang而言,最接近于此处的样式指南的东西是这样写的:

方法的接收者的名称应反映其身份。通常,其类型的一个或两个字母缩写就足够了(例如,“ Client”(客户)使用“ c”或“ cl”)。不要使用诸如“我”,“此”或“自我”之类的通用名称,它们是面向对象语言的典型标识符,这些标识符更加强调方法而非功能。该名称不必像方法参数那样具有描述性,因为它的作用是显而易见的,没有任何文档目的。

我个人一直只是使用“ this”作为标识符,因为“ this”是我编写和编辑函数时正在研究的重点。听起来不错,而且(至少对我而言)是有道理的。

如果名称不需要描述,那么它的作用是显而易见的,并且没有记录目的,为什么“ this”的使用会被拒绝?


3
带有更多答案的类似问题:stackoverflow.com/questions/23482068
Trenton

Answers:


11

我们必须让该样式指南的作者肯定知道,但是我认为我同意他的主要原因是Go中的struct和method之间的联系比其他语言宽松得多

本质上,当您编写这样的方法时:

func (m *MultiShape) area() float64 {
  ...
}

这几乎与编写这样的函数完全一样:

func area(m *MultiShape) float64 {
  ...
}

唯一的区别是在调用函数/方法的方式上语法略有变化。

在其他语言中,this// selfwhatever变量通常具有一些特殊的属性,例如由语言神奇地提供,或具有对私有方法的特殊访问权限(请记住,Go没有私有字段/方法)。尽管仍在某种程度上“神奇地提供”了“接收器”,但它与常规函数自变量非常相似,可以说它不算在内。

另外,在“传统” OOP语言中,所有struct / class定义都带有struct / class方法,因此无法从外部添加更多内容。据我所知,在Go中,任何人都可以向任何事物添加更多方法(当然,在他们自己的代码范围内)。

我还没有编写足够的Go语言来编写自己的样式指南,但就我个人而言,我可能会使用this与它们接收到的结构在同一文件中定义的方法,并在我附加到其他文件的结构上的方法中使用一些更具描述性的接收器名称。


这是一个很好的解释,我想我已经习惯了C#和其他OOP语言,因此我将恢复到我所知道的约定。
亚当

1
@Adam this如果没有其他原因,我会避免,除非要提醒自己我不是使用传统的OOP语言。
迈克尔·汉普顿

4
“ this”和“ receiver”之间没有真正的区别(并且请停止滥用“ magic”一词-高级编程语言的每个功能都可以称为“ magic”,这不会使它成为负面的东西,您尝试选择“ this”是“魔术”是没有意义的)。
mvmn

6

我不是这个风格指南确信,我觉得没有什么比好thismeself。因为thismeself使用户能够无比清晰的变量是上下文结构的一个实例。我并不是说小写的struct name变量不是一个好主意,我只是喜欢this使其变得非常清晰的方式。


如果没有任何解释,那么如果有人发表相反的意见,此答案可能会毫无用处。举例来说,如果有人张贴像一个要求:“我这个风格指南确信,我认为它是优于thismeself,怎么会变成这样的回答帮助读者挑选的两个对立的意见呢?考虑将其编辑为更好的形状,以满足“ 如何回答”准则
gnat 2016年

我想我已经清楚地解释了我想说的话。
钱琛

1
我同意。我认为有太多的大脑被javascript上下文所毒害。如果放在一边。这指的是当前上下文要简单得多。如果稍后重命名结构,或复制粘贴实现的一部分,则更加容易。简短的神秘名称行hl等的锣并没有比这更容易。
Sentient

0

从JavaScript的角度看this,它对编译器具有实际的关键字含义,但是从我的理解来看,如果它们可以使用对象类型的两个字母缩写,那么使用它应该足够容易。造成这种差异的原因是,在一个相当大的,逐步深入的异步代码块中,很容易会误解“此”或接收者在更深的上下文中的含义。并且可能不会是同一对象。

例如,在JavaScript中,控制模块可能会启动一个对话框并onLoad为其声明一个内联函数。但是到那时,另一个编码器很容易将this内部错误解释onLoad为引用控制模块,而不是对话框。或相反亦然。如果将控件称为ctrl并将对话框称为,则可以避免这种情况dg


3
我不是拒绝投票的人,但是thisJavascript中大多数令人困惑的行为根本不适用于Go,所以我猜这就是原因。
Ixrec

@Ixrec Hm ...好吧。我有点想将其扩展到您可以选择this的名称的情况;例如,通常JS编码器会编写var self = this以保持相同的引用。但根据Go的设计指南,该问题可能会遇到同样的困惑,并且在理论上应使用更具描述性的参考。
Katana314 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.