【问题标题】:what is the specific reason to differentiate functions and methods in Go?Go中区分函数和方法的具体原因是什么?
【发布时间】:2020-04-05 20:29:35
【问题描述】:

我已经阅读了函数和方法之间的区别。我已经阅读了一些关于堆栈溢出的先前答案。但是,我不明白为什么它们完全不同。根据我的理解:使用方法可以完成的事情也可以使用 Go 中的函数完成。我知道方法也是函数。为了进一步澄清我的问题,我添加了一个示例:

package main

import (
    "fmt"
)

type Point struct {
    a, b int
}

func (p *Point) sumM() int {
    return p.a + p.b
}
func sumF(p *Point) int {
    return p.a + p.b
}

func (p *Point) mulM(n int) int {
    return (p.a + p.b) * n
}
func mulF(p *Point, n int) int {
    return (p.a + p.b) * n
}

func main() {
    p := Point{2, 3}
    fmt.Println("sumM is: ", p.sumM())
    fmt.Println("sumF is: ", sumF(&p))
    fmt.Println("mulM is: ", p.mulM(2))
    fmt.Println("mulF is: ", mulF(&p, 2))
}

其中MF分别代表方法和函数。

我想知道我是否遗漏了什么;如果这些不同的实现背后有一些真实的推理。例如各有优缺点。

【问题讨论】:

  • 在大多数语言中,方法与类相关,即使它们仍然是函数。所以这是一个范围问题(当你说方法时,它属于一个类,并且只对每个对象实例可用)和进化(在一个类中,一些方法是私有的——内部的——而另一些是公共的,可以用重新定义传统游戏)当然,我的回答不是 Go 特定的,我只是想给出一些提示。
  • Go 的 interface 功能仅适用于方法。

标签: function go methods syntax


【解决方案1】:

来自Golang Methods的一些提示:

  • 方法只是一个带有接收器参数的函数。
  • 方法可帮助您在 Go 中编写面向对象风格的代码。
  • 方法调用比函数调用更容易阅读和理解。
  • 方法可帮助您避免命名冲突。由于方法与特定的接收器相关联,因此您可以在不同的接收器类型上使用相同的方法名称。

The thumb of the rule is 不定义方法,如果:

  • 不需要依赖状态
  • 您可以在任何实现特定接口的类型上执行此功能,这意味着您无需将此功能限制为属于特定类型。

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2017-06-09
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多