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()
}


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

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

通过上面示例代码,我们可以大致得出几点结论。

  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)
}


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

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

上面代码中,通过给函数传入一个指针,修改形参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
}


仍然是运行上诉代码,查看一下执行结果是怎么样的。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. 方法的名称是可以重复的,前提是方法的接收者不能相同。

总结

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

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

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

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

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

调用方式不一样

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

相关推荐

  1. Go函数方法之间什么区别

    2023-12-06 00:54:07       63 阅读
  2. 什么是EMI,它EMC之间什么区别

    2023-12-06 00:54:07       34 阅读
  3. css中Link@import之间什么区别

    2023-12-06 00:54:07       58 阅读
  4. 云安全传统安全之间什么区别

    2023-12-06 00:54:07       37 阅读
  5. 神经网络深度学习之间什么区别

    2023-12-06 00:54:07       29 阅读
  6. “==“ equals 方法究竟什么区别

    2023-12-06 00:54:07       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 00:54:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 00:54:07       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 00:54:07       82 阅读
  4. Python语言-面向对象

    2023-12-06 00:54:07       91 阅读

热门阅读

  1. 大厂面试整理

    2023-12-06 00:54:07       79 阅读
  2. Linux-hid

    2023-12-06 00:54:07       44 阅读
  3. 一文详解Docker数据卷(volume)

    2023-12-06 00:54:07       59 阅读
  4. 安装vscode插件与安装vue项目

    2023-12-06 00:54:07       63 阅读
  5. webpack对项目进行优化

    2023-12-06 00:54:07       60 阅读
  6. CoreDns在K8S中的作用原理概述

    2023-12-06 00:54:07       51 阅读
  7. expect自动化交互

    2023-12-06 00:54:07       59 阅读
  8. Docker 安装 Nacos

    2023-12-06 00:54:07       56 阅读
  9. 前端实现websocket的应用场景以及逻辑实现

    2023-12-06 00:54:07       58 阅读
  10. DAPP开发【05】ERC20/ERC721简介

    2023-12-06 00:54:07       65 阅读