清晰易懂的说明Golang 中函数与方法

个人理解

我们都知道go语言即不是面向对象的语言,也不是面向过程的语言,它的设计初衷是让编程者更好的实现功能。所以这句话可以理解为:

Golang 即有面向对象编程语言的优点也有面向过程语言的优点,所以它即可以用面向对象编程语言东西,也可以用面向过程语言的东西。

方法是面向对象里的东西,而函数是面向过程里的东西,知道这个我们就能很容易理解Golang中的方法和函数了。

基本规则

为了把方法和函数说得更深入一些,下面上点干货:

1、方法必定和某个类型绑定,从而实现该类型的某些行为 【熟悉面向对象的同学应该都明白,方法是某一类特有的行为,比如:人会吃饭 person.eat() 】

2、函数是不允许同名的,而同名的方法则是可以允许在不同的类型上定义。【函数相当于是全局的,方法只有在某个类下是唯一的,不同的类型可以同名,比如:动物也会吃饭 animal.eat() 】

代码说明

package main

import "fmt"

// 定义一个人的结构体(这是一种类型)
type Person struct {
	Age    int
	Name   string
	height int
}


// 下面是函数(两个人的岁数相加)
func AddAge(p1, p2 Person) int {
    return (p1.Age + p2.Age)
}

// 下面是方法(修改一个人的年龄)【指针方法】
// func 后面括号里的p就是你在实际调用时所使用的对象(这里是一个指针)
// 也就是说谁调用修改谁的年龄
func (p *Person) SetAge(age int) {
    p.Age = age
    fmt.Printf("SetAge 方法内部人员的信息: %v\n", p)
}

// 下面也是方法(还是修改一个人的年龄)【值方法】
// func后面括号里的是一个真实的值,这个值只在此方法内有效
// 也就是说它是主体对象复制出来的一个副本
func (p Person) SetAge1(age int) {
    p.Age = age
    fmt.Printf("SetAge1 方法内部人员的信息: %v\n", p)
}

func main() {

    p1 := Person{18, "小明", 180}
	fmt.Printf("p1的初始信息:%v\n", p1)

	p2 := Person{25, "小亮", 190}

	p1.SetAge(22)
	fmt.Printf("方法外p1调用SetAge方法后p1的值: %v\n", p1)

	p1.SetAge1(33)
	fmt.Printf("方法外p1调用SetAge1方法后p1的值: %v\n", p1)

	totalAge := AddAge(p1, p2)
	fmt.Printf("p1与p2两个人岁数相加后的值为: %v\n", totalAge)
}

运行之后的结果是:

p1的初始信息:{18 小明 180}

SetAge 方法内部人员的信息: &{22 小明 180}

方法外p1调用SetAge方法后p1的值: {22 小明 180} 

SetAge1 方法内部人员的信息: {33 小明 180} 
    
方法外p1调用SetAge1方法后p1的值: {22 小明 180}

p1与p2两个人岁数相加后的值为: 47 

文字解释

1、值方法的接收者是该方法所属的那个类型值的一个副本。我们在该方法内对该副本的修改一般都不会体现在原值上,除非这个类型本身是某个引用类型(比如切片或字典)的别名类型。

2、指针方法的接收者是该方法所属的那个基本类型值的指针值的一个副本。我们在这样的方法内对该副本指向的值进行修改,是一定会体现在原值上的。

3、函数就是为了实现某些特殊功能,它与其调用的类型并无太大的关系,最多是使用了类型中的一些属性及方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yezhijing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值