go函数与方法的区别

BIT_ · 2020-12-11 18:14:55 · 1611 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-12-11 18:14:55 的主题,其中的信息可能已经有所发展或是发生改变。

求助大神?百度过了,教程也看了,还是不明白函数与方法的区别在哪里,在我看来方法是多余的,因为你方法可以做的我函数也可以做,为什么要方法呢?下面我要打印结构体name字段,函数和方法都行,所以我为什么要用方法?求大神解惑,方法应该有更深层次的原因才存在的。

// Pen 结构体
type Pen struct{ name string }

// 方法
func (p Pen) pens() Pen {
    p.name = "nihao"
    return p
}

// 函数
func pening() Pen {
    var pp Pen
    pp.name = "wohao"
    return pp
}

func main() {
    p2 := pening()    // 函数直接调用就行
    fmt.Println(p2.name) 
    p1 := p2.pens()    // 方法还要在调用别的函数
    fmt.Println(p1.name)
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1611 次点击  
加入收藏 微博
7 回复  |  直到 2021-01-03 13:21:18
xuanwen
xuanwen · #1 · 4年之前

面向过程与面向对象的区别

一时想不到怎么更好的用通俗的语言解释这种两种的区别,请允许我借用其他人的解释 https://www.cnblogs.com/strivers/p/6681876.html

面向过程(你说的函数)就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了

面向对象(你说的方法)是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

补充一:结构体名字没有首字母大写

不确定你是不是还在新手村,还是只是单独的举个简单例子,注意到你的结构体名字没有首字母大写,我就多啰嗦一句。

Go语言中字母大写 代替了 public,小写为private

没有首字母大写别的包无法调用,函数体与方法都是

补充二: 程序里面方法和函数有区别吗?

那东西不是同一个含义吗?

我记得在我的概念里面是一个是全局函数/常规函数/通用函数---你说的函数,另外一个是某某类的函数,某某对象的函数---你说的方法

我不确定是不是自己的概念出问题啦,需要其他人确认一下。

我接触到的几种编程语言基本上定义函数/方法都是 function这个单词,要不就没有

为此我专门去查了几种比较常见的编程语言定义函数/方法的格式

C定义函数关键词:无

返回值类型 方法名称(参数类型 参数名称,……)
{
   方法内容
}

C++定义函数关键词:无

返回值类型 函数名(参数类型 参数名称,…… )
{
   方法内容
}

Java定义函数关键词:无

修饰符(public static)返回值类型 方法名称(参数类型 参数名称,……){

方法体

return 返回值;

}

php定义函数关键词:function

function 方法名称(参数名称,……)
{
    // 要执行的代码
}

python3定义函数关键词:def

def 函数名(参数名称,……):
    函数体

js定义函数关键词:function

function 方法名称(参数名称,……)
{
    // 执行代码
}

Go定义函数关键词:func

func 函数名(参数名称 参数类型,……) [返回值名称 返回值类型,……] {
   函数体
}

总结:在这些语言里面定义函数/方法的关键词为

C、C++、JAVA的关键词:

PHP、JS、Go的关键词: function及其简写

Python3的关键词: define的简写def

我有很大的把握确定,函数与方法很可能是编程语言里面同一个概念的不同中文翻译

数据收集

不过以上都是我一家之言,并没有100%把握;所以后面的人如果方便的话,做个统计。

在你们的理念里面,函数与方法是两个不同的东西吗?

相同的请回复 1;

不相同的请回复 2;

focusonline
focusonline · #2 · 4年之前

准确的说方法和函数没有本质的区别, 在其他语言中也是如此. 只不过golang比较直接, 把其他语言中对象方法隐含传递的this对象(指针)写在明面上了而已.

   type someType struct {
      A string
   }
   func (t *someType) test {
      // 这里的t就是this
     t.A = "AAA"
  }
  func main() {
    st := someType{}
    st.A = "AAA" // 和调用st.test结果没有任何区别
 }

方法的用途主要有2个, 一个是为了实现interface{}, 另外一个是为了同名函数隔离

BIT_
BIT_ · #3 · 4年之前

谢谢各位大神的回答,我现在想的是:有三个村子A,B,C,方法就是:修一条路,从A到B再到C,类似设定,人可以用方法从A到B再到C。函数:人必须从A走到B再走到C,走不过去我就修路过去,类似流程。

BIT_
BIT_ · #4 · 4年之前

其实还是我现在想太多,多用代码应该就会理解。举个例子:我不知道番茄是什么,别人告诉我番茄可以当水果吃,或者做番茄炒蛋吃。我去买番茄,发现有两种番茄:大番茄和小番茄。我不知道大番茄和小番茄的区别,因为其他人告诉我他们是一样的,所以我两种番茄都买了。我回到家,分别吃起它们,发现大番茄汁水溅到我身上了,而小番茄没有,所以以后当水果吃的时候应该选小番茄,或者吃大番茄的时候小心点。番茄炒蛋用小番茄炒鸡蛋没有大番茄味道好,所以以后做番茄炒蛋应该用大番茄。(说的太多了,感觉看的麻烦)

JGbooks
JGbooks · #5 · 4年之前

方法和函数只是看概念两者没什么差别,如果放到工程项目中,2这区别就大了, 比如工程中使用方法,多数为了达到程序设计中高内聚,低耦合,以及接口隔离的设计方法,也有为了支持程序的扩展。

你的工程里面可以都是函数实现,但是一个可扩展,好理解的,必定离不开方法 说白了设计模式里面多数用方法实现以上论点

pardon110
pardon110 · #6 · 4年之前

方法也是函数的一种,只不过比较特殊而已。如下所示,带数据集入参的函数本质上就是一个方法。

package main

import "fmt"

type Pen struct{ name string }

// 方法
func (p *Pen) pens() {
    p.name = "nihao"
}

// 函数
func pening(p *Pen) {
    p.name = "wohao"
}


func main() {
    p2 := new(Pen)
    pening(p2)    
    fmt.Println(p2.name) 
    p1 := new(Pen)
     p1.pens()   
    fmt.Println(p1.name)
}
taatcc
taatcc · #7 · 4年之前

在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中有点区别,方法是包含了接收者的函数。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传