方法和函数的区别—Golang

110 阅读2分钟

区别

  1. 调用方式不一样

    • 函数调用方式: 函数名(实参列表)
    • 方法调用方式: 变量.方法名(实参列表)
  2. 对于普通函数来说,参数接收者为值类型时,不能将指针类型数据直接传入,反之亦然。

  3. 对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来也可以

代码展示

下面展示的代码,分别从方法和函数的调用、传参来演示方法和函数的区别👇

package main

import "fmt"

type Person struct {
	Name string
}

// 实现打印人名的函数
// 普通函数,参数是值类型,传递的参数也必须是值类型;参数是指针类型,必须传递地址。
func printName(p Person) {
	fmt.Println("printName函数 人名 = ", p.Name) // tom
}
func printName2(p *Person) {
	fmt.Println("printName函数 人名 = ", p.Name) // tom
}

// 值接收者Person的方法
func (p Person) printName() {
	p.Name = "jack"
	fmt.Println("Person 方法 人名 = ", p.Name) // jack
}

// 指针接收者Person的方法
func (p *Person) printName2() {
	p.Name = "bill"
	fmt.Println("*Person 方法 人名 = ", p.Name) // bill
}

func main() {
	// 方法和函数的区别
	p := Person{"tom"}
	// 调用函数
	printName(p)
	printName2(&p) // 函数的形参类型必须跟实参类型一致,都为值类型,或者都为指针类型

	// 调用方法 (值接收者)
	// 值接收者 不论调用者变量是值还是地址,都不会改变原始数据
	p.printName()
	fmt.Println("值接收者1 p.Name = ", p.Name) // tom
	(&p).printName()
	fmt.Println("值接收者2 p.Name = ", p.Name) // tom

	// 调用方法 (指针接收者)
	// 指针接收者, 会改变原始数据
	p.printName2()
	fmt.Println("指针接收者1 p.Name = ", p.Name) // bill
	(&p).printName2()
	fmt.Println("指针接收者2 p.Name = ", p.Name) // bill
}

🎈🎈🎈

🌹 关注我,你会发现一个不太安分的宝藏前端,让我们一起共同成长😊

🎉 喜欢的小伙伴可以点赞收藏关注

✨ 欢迎大家转发评论交流, 蟹蟹😊

本文正在参加技术专题18期-聊聊Go语言框架