• Go函数和方法之间有什么区别


    基础知识

    在了解两者不同之前,还是简单的回顾一下基础语法知识。下面的实例,定义一个函数和方法,然后调用函数和方法。

    package main
    
    import "fmt"
    
    // 函数和方法
    func function1() {
    	fmt.Println("我是一个名字叫做function1的函数")
    }
    
    type User struct {
    	name string
    	age  uint
    }
    
    func (u User) function1() {
    	fmt.Println("我是一个名字叫做function1的方法")
    }
    
    func main() {
    	// 调用函数
    	function1()
    	// 调用方法
    	User{}.function1()
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    执行上述代码,go run main,会打印出如下的结果:

    kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
    我是一个名字叫做function1的函数
    我是一个名字叫做function1的方法
    
    • 1
    • 2
    • 3

    通过上面示例代码,我们可以大致得出几点结论。
    1、调用函数时,直接使用函数名即可(如果调用者和被调用者都在同一个包名下);调用方法,需要实例化结构体,然后通过结构体的方式去调用方法(结构体实例化有多种,示例代码使用的是字面量的方式)。
    2、函数在定义时,直接使用 func + 函数名()即可;方法在定义时,需要使用 func (方法的接收者) + 函数名()才可以。
    3、方法是通过"."的方式进行调用,而函数是直接使用函数名。

    使用指针

    接下来,在函数和方法中使用指针大佬修改值的效果。

    package main
    
    import "fmt"
    
    // 函数和方法
    func function1(a *int) {
    	*a = 19
    }
    
    type User struct {
    	name string
    	age  uint
    }
    
    func (u *User) function1() {
    	u.age = 10
    }
    
    func main() {
    	a := 10
    	function1(&a)
    	fmt.Println("函数function1运行结果为", a)
    
    	user := User{age: 12, name: "张三"}
    	user.function1()
    	fmt.Println("结构体user的结果是", user.age)
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行上诉代码,查看一下执行效果。go run main。

    kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
    函数function1运行结果为 19
    结构体user的结果是 10
    
    • 1
    • 2
    • 3

    上面代码中,通过给函数传入一个指针,修改形参a的值;通过方法接收一个指针类型的接收者。都能够修改原值,这一点不管是函数还是方法,都没是一样的。

    是否同名

    接下来,通过下面的实例代码,来演示函数和方法是否支持定义相同的名称。

    package main
    
    import "fmt"
    
    // 函数和方法
    func function1(a *int) {
    	*a = 19
    }
    
    func function1() {
    	fmt.Println("随便打印一点东西")
    }
    
    type User struct {
    	name string
    	age  uint
    }
    
    func (u *User) function1() {
    	u.age = 10
    }
    
    type Animal struct {
    	name string
    	age  uint
    }
    
    func (u *Animal) function1() {
    	u.age = 10
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    仍然是运行上诉代码,查看一下执行结果是怎么样的。go run main。

    kert@kertdeMBP ~/c/p/w/l/g/b/demo1 (master)> go run demo5.go
    # command-line-arguments
    ./demo5.go:10:6: function1 redeclared in this block
    	./demo5.go:6:6: other declaration of function1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以通过运行结果得出如何结论。

    1、函数的名称是不能重复的,不管是传递的参数还是返回的参数是否相同,函数名称都不允许重复定义。

    2、方法的名称是可以重复的,前提是方法的接收者不能相同。

    总结

    含义不同

    函数function是⼀段具有独⽴功能的代码,可以被反复多次调⽤,从⽽实现代码复⽤。⽽⽅法method是⼀个类的⾏为功能,只有该类的对象才能调⽤。

    ⽅法有接受者,⽽函数⽆接受者

    1、Go语⾔的⽅法method是⼀种作⽤于特定类型变量的函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器);
    2、接受者的概念类似于传统⾯向对象语⾔中的this或self关键字;
    3、Go语⾔的接受者强调了⽅法具有作⽤对象,⽽函数没有作⽤对象;
    4、⼀个⽅法就是⼀个包含了接受者的函数;
    5、Go语⾔中, 接受者的类型可以是任何类型,不仅仅是结构体, 也可以是struct类型外的其他任何类型。

    函数不可以重名,⽽⽅法可以重名

    1、只要接受者不同,则⽅法名可以⼀样。

    调用方式不一样

    1、方法是struct对象通过.点号+名称来调用,而函数是直接使用名称来调用。

  • 相关阅读:
    【C++】string模拟实现
    linux升级python3
    TMS WEB Core 2.0.2 Retail
    【JavaScript 漫游】【036】CORS 通信总结
    SpringBoot添加过滤器详解
    Javaweb之Vue指令案例的详细解析
    matplotlib 中使用中文
    腾讯云服务器使用教程,手把手教你入门
    Excel 数据透视表教程大全之 01 什么是数据透视表 如何创建数据透视表
    Django面对高并发现象时处理方法
  • 原文地址:https://blog.csdn.net/m0_73728511/article/details/133222199