等价于类函数
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
-指针最相似(但请注意,将接收器命名为this
、self
等在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)
【讨论】:
以上是关于等价于类函数的主要内容,如果未能解决你的问题,请参考以下文章
是否有适用于类组件的 React Material-UI makeStyles() 函数的非挂钩替代方案