等价于类函数

Posted

技术标签:

【中文标题】等价于类函数【英文标题】:Equivalent to class functions 【发布时间】:2021-09-25 22:54:27 【问题描述】:

我在 Go 中遇到了一段代码,

type Person struct 
   Id int


func (Person) SayHello() (string) 
   return "Hello"

这是否等同于 Go 中的类函数?这个的确切名称是什么?我在函数接收器中找不到这个。

调用部分也是这样的--Person.SayHello(Person) 如果必须像这样传递 Person,那么为什么要使用 func (Person) SayHello() (string) 而不是func (p *Person) SayHello() (string)

【问题讨论】:

在 Go 中没有类,或者任何与类完全等价的东西,因此不存在与“类函数”等价的东西。 这取决于你的具体用法,但最简单的方法就是做一个普通的函数。如果它不是一种方法,就不要让它成为一种方法。 【参考方案1】:

我在函数接收器中找不到这个 ...

这很奇怪,因为它是一个带有接收器的函数。

func (Person) SayHello() - 具有Person 类型的未命名接收器的函数 func (p Person) SayHello() - 带有p 类型的接收器Person 的函数 func (p *Person) SayHello() - 具有接收器 p 的函数,其类型为指针指向-Person

值和指针接收器有不同的用途,参见例如Choosing a value or pointer receiver.

例如,Person.SayHello() 不适用于指针接收器。但是如果函数需要改变接收器,那么别无选择,只能使用指针接收器。指针接收器与面向对象语言中的this-指针最相似(但请注意,将接收器命名为thisself 等在Go 中被视为bad style)。

【讨论】:

【参考方案2】:

这里只有一个带有未命名接收器参数的方法。在 Go 中省略参数名称是有效的,如果你知道你不会使用它,这可能是有意义的。这在规范的this part 中有介绍。

在这方面,接收器与任何其他函数参数没有什么不同。所以其他一些类似的例子包括:

func (p *Person) Do(string) 
    fmt.Println("I won't do what you ask.")

Related 是空白标识符,可以用来忽略函数参数的子集:

func (p *Person) DoAndSay(_, message string) 
    fmt.Println("I won't do what you want, but I will say it: %s", message)

【讨论】:

以上是关于等价于类函数的主要内容,如果未能解决你的问题,请参考以下文章

Python functools.wraps 等价于类

是否有适用于类组件的 React Material-UI makeStyles() 函数的非挂钩替代方案

jQuery函数的等价原生函数代码示例

javascript 等价于 php unpack() 函数

函数中静态变量的 Python 等价物是啥?

熊猫explode()函数的考拉等价物是啥?