Function 在Go中区分函数和方法的具体原因是什么?

Function 在Go中区分函数和方法的具体原因是什么?,function,go,methods,syntax,Function,Go,Methods,Syntax,我已经读过函数和方法之间的区别。我已经阅读了以前关于堆栈溢出的一些答案。然而,我不明白为什么它们保持不同。根据我的理解:使用方法可以完成的任何事情也可以使用Go中的函数完成。我知道方法也是函数。为了进一步澄清我的问题,我添加了一个示例: package main import ( "fmt" ) type Point struct { a, b int } func (p *Point) sumM() int { return p.a + p.b } func su

我已经读过函数和方法之间的区别。我已经阅读了以前关于堆栈溢出的一些答案。然而,我不明白为什么它们保持不同。根据我的理解:使用方法可以完成的任何事情也可以使用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分别表示方法和函数

我想知道我是否错过了什么;如果在这些不同的实现背后有一些真实的推理。e、 g.每种方法的优点和缺点。

以下几点提示:

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

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

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