广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >go语言中方法和函数的区别是什么
  • 108
分享到

go语言中方法和函数的区别是什么

go语言Golang 2023-05-14 19:05:40 108人浏览 安东尼
摘要

区别:1、函数function是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用;而方法method是一个类的行为功能,只有该类的对象才能调用。2、方法有接受者,而函数无接受者。3、函数不可以重名,而方法可以重名。4、调用方式不

区别:1、函数function是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用;而方法method是一个类的行为功能,只有该类的对象才能调用。2、方法有接受者,而函数无接受者。3、函数不可以重名,而方法可以重名。4、调用方式不一样。5、方法需要指定所属类型,可以是结构体也可以是自定义type,函数则通用。6、函数的形参与传参类型需要一致,方法可以改变。

go语言中方法和函数的区别是什么

教程操作环境:windows7系统、Go 1.18版本、Dell G3电脑。

在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如Java,一般来说,函数就是方法,方法就是函数,但是在Go语言中,函数是指不属于任何结构体、类型的方法,也就是说,函数是没有接收者的;而方法是有接收者的,我们说的方法要么是属于一个结构体的,要么属于一个新定义的类型的。

函数

函数和方法,虽然概念不同,但是定义非常相似。函数的定义声明没有接收者,所以我们直接在go文件里,go包之下定义声明即可。

func main() {
    sum := add(1, 2)
    fmt.Println(sum)
}

func add(a, b int) int {
    return a + b
}

例子中,我们定义了add就是一个函数,它的函数签名是func add(a, b int) int,没有接收者,直接定义在go的一个包之下,可以直接调用,比如例子中的main函数调用了add函数。

例子中的这个函数名称是小写开头的add,所以它的作用域只属于所声明的包内使用,不能被其他包使用,如果我们把函数名以大写字母开头,该函数的作用域就大了,可以被其他包调用。这也是Go语言中大小写的用处,比如Java中,就有专门的关键字来声明作用域privateprotectpublic等。


package lib

// 一个加法实现
// 返回a+b的值
func Add(a, b int) int {
    return a + b
}

如上例子中定义的Add方法就可以被其他包调用。

方法

方法的声明和函数类似,他们的区别是:方法在定义的时候,会在func和方法名之间增加一个参数,这个参数就是接收者,这样我们定义的这个方法就和接收者绑定在了一起,称之为这个接收者的方法。

type person struct {
    name string
}

func (p person) String() string{
    return "the person name is "+p.name
}

留意例子中,func和方法名之间增加的参数(p person),这个就是接收者。现在我们说,类型person有了一个String方法,现在我们看下如何使用它。

func main() {
    p:=person{name:"张三"}
    fmt.Println(p.String())
}

调用的方法非常简单,使用类型的变量进行调用即可,类型变量和方法之前是一个.操作符,表示要调用这个类型变量的某个方法的意思。

Go语言里有两种类型的接收者:值接收者和指针接收者。我们上面的例子中,就是使用值类型接收者的示例。

使用值类型接收者定义的方法,在调用的时候,使用的其实是值接收者的一个副本,所以对该值的任何操作,不会影响原来的类型变量。

func main() {
    p:=person{name:"张三"}
    p.modify() //值接收者,修改无效
    fmt.Println(p.String())
}

type person struct {
    name string
}

func (p person) String() string{
    return "the person name is "+p.name
}

func (p person) modify(){
    p.name = "李四"
}

以上的例子,打印出来的值还是张三,对其进行的修改无效。如果我们使用一个指针作为接收者,那么就会其作用了,因为指针接收者传递的是一个指向原值指针的副本,指针的副本,指向的还是原来类型的值,所以修改时,同时也会影响原来类型变量的值。

func main() {
    p:=person{name:"张三"}
    p.modify() //指针接收者,修改有效
    fmt.Println(p.String())
}

type person struct {
    name string
}

func (p person) String() string{
    return "the person name is "+p.name
}

func (p *person) modify(){
    p.name = "李四"
}

只需要改动一下,变成指针的接收者,就可以完成了修改。

在调用方法的时候,传递的接收者本质上都是副本,只不过一个是这个值副本,一是指向这个值指针的副本。指针具有指向原有值的特性,所以修改了指针指向的值,也就修改了原有的值。我们可以简单的理解为值接收者使用的是值的副本来调用方法,而指针接收者使用实际的值来调用方法。

在上面的例子中,有没有发现,我们在调用指针接收者方法的时候,使用的也是一个值的变量,并不是一个指针,如果我们使用下面的也是可以的。

p:=person{name:"张三"}
(&p).modify() //指针接收者,修改有效

这样也是可以的。如果我们没有这么强制使用指针进行调用,Go的编译器自动会帮我们取指针,以满足接收者的要求。

同样的,如果是一个值接收者的方法,使用指针也是可以调用的,Go编译器自动会解引用,以满足接收者的要求,比如例子中定义的String()方法,也可以这么调用:

p:=person{name:"张三"}
fmt.Println((&p).String())

总之,方法的调用,既可以使用值,也可以使用指针,我们不必要严格的遵守这些,Go语言编译器会帮我们进行自动转义的,这大大方便了我们开发者。

不管是使用值接收者,还是指针接收者,一定要搞清楚类型的本质:对类型进行操作的时候,是要改变当前值,还是要创建一个新值进行返回?这些就可以决定我们是采用值传递,还是指针传递。

Go语言中方法和函数的区别

1、含义不同

函数function是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用。而方法method是一个类的行为功能,只有该类的对象才能调用。

2、方法有接受者,而函数无接受者

  • Go语言的方法method是一种作用于特定类型变量的函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器);

  • 接受者的概念类似于传统面向对象语言中的this或self关键字;

  • Go语言的接受者强调了方法具有作用对象,而函数没有作用对象;

  • 一个方法就是一个包含了接受者的函数;

  • Go语言中, 接受者的类型可以是任何类型,不仅仅是结构体, 也可以是struct类型外的其他任何类型。

3、函数不可以重名,而方法可以重名

只要接受者不同,则方法名可以一样。

4、调用方式不一样

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

方法的调用需要指定类型变量调用,函数则不需要

 ```
var p testMethod.Person
p.Name = "tom"
p.Age = 123
p.ShowInfo()

注:方法和函数的访问权限都受大小写影响,小写本包,大写全局

5、方法需要指定所属类型,可以是结构体也可以是自定义type,函数则通用

```
func (person Person) ShowInfo(形参) 返回值{

   person.Name = "123"
   person.Age = 12
   fmt.Printf("name=%v,age=%v",person.Name,person.Age)
}
```
 
person为类型的形参,类型为Person

6、函数的形参与传参类型需要一致,方法可以改变

     ```
func (person *Person) ShowInfo(形参) 返回值{

   person.Name = "123"
   person.Age = 12
   fmt.Printf("name=%v,age=%v",person.Name,person.Age)
}

(1)这里方法的类型形参为指针,调用时可以使用 p.ShowInfo()或者 (&p).ShowInfo(),本质上都是后者,只不过Go的设计者对于方法的调用做了底层优化

func (person Person) ShowInfo(形参) 返回值{

   person.Name = "123"
   person.Age = 12
   fmt.Printf("name=%v,age=%v",person.Name,person.Age)
}

(2)这里方法的形参类型为数值型,默认为值传递,而在调用时可以使用p.ShowInfo()或者 (&p).ShowInfo(),但依旧是值拷贝

func test01(i *int) {


}

(3)对于函数则需保持一致,需要的形参为指针,则传入的形参需为地址值,否则编译无法通过

【相关推荐:Go视频教程、编程教学】

以上就是go语言中方法和函数的区别是什么的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: go语言中方法和函数的区别是什么

本文链接: https://www.lsjlt.com/news/203493.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言中方法和函数的区别是什么
    区别:1、函数function是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用;而方法method是一个类的行为功能,只有该类的对象才能调用。2、方法有接受者,而函数无接受者。3、函数不可以重名,而方法可以重名。4、调用方式不...
    99+
    2023-05-14
    go语言 Golang
  • go语言中方法和函数的区别有哪些
    本文小编为大家详细介绍“go语言中方法和函数的区别有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中方法和函数的区别有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。区别:1、函数function...
    99+
    2023-07-04
  • Go语言中make和new函数的用法与区别
    相同点: make和new都是用来创建分配类型内存的。 不同点: 先看下面的代码 package main import "fmt" func main(){ var i *in...
    99+
    2022-11-13
  • go语言和java的区别是什么
    本篇内容主要讲解“go语言和java的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言和java的区别是什么”吧!区别:1、Go不允许函数重载,java允许;2、Java默认允许...
    99+
    2023-07-04
  • go语言调用函数方法是什么
    在go语言中,定义了函数之后,我们可以通过“函数名()”的方式调用函数,语法“返回值变量列表 = 函数名(参数列表)”。当“()”中包含多个参数时,参数变量以逗号分隔,尾部无须以分号结尾;“返回值变量列表”中,多个返回值使用逗号分隔。本教程...
    99+
    2023-05-14
    Golang go语言 Go
  • Go语言中Print、Printf和Println的区别是什么
    今天小编给大家分享一下Go语言中Print、Printf和Println的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-07-05
  • java中函数和方法的区别是什么?
    java中函数和方法的区别是什么?面向对象的语言叫方法面向过程的语言叫函数在java中没有函数这么一说,只有方法一说。实际上方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已。【推荐教程:Java视频教程】一句话告诉你如何区分函数与...
    99+
    2022-02-08
    java入门 java 函数 方法
  • go语言中线程和进程的区别是什么
    区别:1、线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位。2、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。3、线程上下文切换比进程上下文切换要快得多。4、进程切换需要的资源很最大,效率很低;线程切换需要的...
    99+
    2023-05-14
    go语言 Golang
  • Go 语言中的数组和切片有什么区别?
    在 Go 语言中,数组和切片都是常见的数据结构。尽管它们都可以用于存储相同类型的数据,但它们在语义上具有不同的行为,这使得它们在实际使用中有着不同的用途。 数组 数组是一种固定长度、存储相同类型元素的集合。在 Go 语言中,数组的长度...
    99+
    2023-10-07
    数组 git 日志
  • python和go语言的区别有什么
    本篇文章为大家展示了python和go语言的区别有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。go语言Go(又称 Golang)是 Google 的 Robert Griesemer,Rob ...
    99+
    2023-06-15
  • go语言的匿名函数定义方法是什么
    go语言的匿名函数定义方法是“func(参数列表)(返回参数列表){函数体}”,其实匿名函数的定义就是没有名字的普通函数定义。匿名函数完全可以当作一个类型,可以直接赋值,可以赋值给变量,可以当作实参或者返回值进行使用,当然也可以直接进行调用...
    99+
    2023-05-14
    匿名函数 go语言 Golang
  • go语言变量和指针的区别是什么
    区别是:1、内存分配方式,变量在栈上分配内存,指针在堆上分配内存;2、传递方式,变量传递的是变量的副本,指针传递的是变量的地址;3、空指针,变量不能为nil,指针可以为nil;4、空指针进行解引用操作会导致运行时错误,变量进行解引用操作是合...
    99+
    2023-12-14
    go语言 变量 指针
  • Go语言中make和new有什么区别
    这篇文章主要介绍“Go语言中make和new有什么区别”,在日常操作中,相信很多人在Go语言中make和new有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中make和new有什么区别”的疑...
    99+
    2023-07-05
  • c语言和java的语法区别是什么?
    c语言和java的语法区别单文件的编译时间java比C语言快;C语言可以直接操作内存,java不能直接操作;C语言可以封装动态库,java不行;C语言的代码不容易跨平台,java的代码容易跨平台;C语言有指针,java没有指针;C语言可以直...
    99+
    2017-01-22
    java教程 c语言 java
  • Go语言中new和make关键字的区别是什么
    这篇文章主要介绍了Go语言中new和make关键字的区别是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中new和make关键字的区别是什么文章都会有所收获,下面我们一起来看看吧。newnew 是一...
    99+
    2023-07-05
  • php中语言结构和函数有什么区别
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等。例子:if ( isset($user) ) {...
    99+
    2017-01-25
    php 语言结构 函数
  • go语言中的输入函数是什么
    go语言的输入函数:1、Scan()函数,可从终端读取多个变量,以空格或换行符作为分隔符,语法“fmt.Scan(地址列表)”。2、Scanln()函数,可从终端读取多个变量,以空格作为分隔符,语法“fmt.Scanln(地址列表)”。3、...
    99+
    2023-05-14
    go语言 Golang Go
  • go语言中函数是什么意思
    在go语言中,函数是组织好的、可重复使用的、用来实现单一具体或相关联功能的代码段(块);其主要目的是提高应用的模块性和代码的重复利用率,更好的管理代码,模块化开发。函数通常使用参数和返回值,与调用者交互数据;参数给函数传递数据,返回值,函数...
    99+
    2023-05-14
    函数 Golang Go go语言
  • java中函数与方法的区别是什么
    Java中函数与方法的区别:面向对象的编程语言中叫方法;面向过程的编程语言中叫函数。在java中没有函数这么一说,只有方法一说。实际上方法就是函数,函数就是方法,只是在不同的语言不同的称呼而已。推荐教程:Java教程...
    99+
    2019-03-14
    java入门 java 函数 方法 区别
  • go语言中协程与线程的区别是什么
    区别:1、一个线程可以多个协程,一个进程也可以单独拥有多个协程;2、线程是同步机制,而协程则是异步;3、协程能保留上一次调用时的状态,线程不行;4、线程是抢占式,协程是非抢占式的;5、线程是被分割的CPU资源,协程是组织好的代码流程,协程需...
    99+
    2023-05-14
    Golang go语言 协程 线程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作