求助大神?百度过了,教程也看了,还是不明白函数与方法的区别在哪里,在我看来方法是多余的,因为你方法可以做的我函数也可以做,为什么要方法呢?下面我要打印结构体name字段,函数和方法都行,所以我为什么要用方法?求大神解惑,方法应该有更深层次的原因才存在的。
```go
// 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)
}
```
方法和函数只是看概念两者没什么差别,如果放到工程项目中,2这区别就大了,
比如工程中使用方法,多数为了达到程序设计中高内聚,低耦合,以及接口隔离的设计方法,也有为了支持程序的扩展。
你的工程里面可以都是函数实现,但是一个可扩展,好理解的,必定离不开方法
说白了设计模式里面多数用方法实现以上论点
#5
更多评论
### 面向过程与面向对象的区别
一时想不到怎么更好的用通俗的语言解释这种两种的区别,请允许我借用其他人的解释
`https://www.cnblogs.com/strivers/p/6681876.html`
**面向过程**(你说的函数)就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
**面向对象**(你说的方法)是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
### 补充一:结构体名字没有首字母大写
不确定你是不是还在新手村,还是只是单独的举个简单例子,注意到你的结构体名字没有首字母大写,我就多啰嗦一句。
Go语言中字母大写 代替了 public,小写为private
`没有首字母大写别的包无法调用,函数体与方法都是`
### 补充二: 程序里面方法和函数有区别吗?
那东西不是同一个含义吗?
我记得在我的概念里面是一个是全局函数/常规函数/通用函数---你说的函数,另外一个是某某类的函数,某某对象的函数---你说的方法
我不确定是不是自己的概念出问题啦,需要其他人确认一下。
我接触到的几种编程语言基本上定义函数/方法都是 function这个单词,要不就没有
为此我专门去查了几种比较常见的编程语言定义函数/方法的格式
#### C定义函数关键词:无
```c
返回值类型 方法名称(参数类型 参数名称,……)
{
方法内容
}
```
#### C++定义函数关键词:无
```c++
返回值类型 函数名(参数类型 参数名称,…… )
{
方法内容
}
```
#### Java定义函数关键词:无
```java
修饰符(public static)返回值类型 方法名称(参数类型 参数名称,……){
方法体
return 返回值;
}
```
#### php定义函数关键词:function
```
function 方法名称(参数名称,……)
{
// 要执行的代码
}
```
python3定义函数关键词:def
``` python
def 函数名(参数名称,……):
函数体
```
#### js定义函数关键词:function
```javascript
function 方法名称(参数名称,……)
{
// 执行代码
}
```
#### Go定义函数关键词:func
```golang
func 函数名(参数名称 参数类型,……) [返回值名称 返回值类型,……] {
函数体
}
```
#### 总结:在这些语言里面定义函数/方法的关键词为
C、C++、JAVA的关键词: **无**
PHP、JS、Go的关键词: **function及其简写**
Python3的关键词: **define的简写def**
我有很大的把握确定,`函数与方法很可能是编程语言里面同一个概念的不同中文翻译`
### 数据收集
不过以上都是我一家之言,并没有100%把握;所以后面的人如果方便的话,做个统计。
在你们的理念里面,函数与方法是两个不同的东西吗?
**相同**的请回复 `1`;
**不相同**的请回复 `2`;
#1
准确的说方法和函数没有本质的区别, 在其他语言中也是如此.
只不过golang比较直接, 把其他语言中对象方法隐含传递的this对象(指针)写在明面上了而已.
```go
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{}, 另外一个是为了同名函数隔离
#2