一文带你了解Go语言中方法的调用

 更新时间:2022年12月02日 08:23:16   作者:陈明勇  
这篇文章主要和大家分享一下Go语言中的方法的调用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下

前言

在前面的 一文熟悉 Go 函数 文章中,介绍了 Go 函数的声明,函数的几种形式如匿名函数、闭包、基于函数的自定义类型和函数参数详解等,而本文将对方法进行介绍,方法的本质就是函数,介绍方法的同时也会顺带对比其与函数的不同之处。

方法

在 Go 中,我们可以为任何的数据类型定义方法(指针或接口除外),现在让我们看一看方法的声明和组成部分以及与函数有什么不同之处。

type Person struct {
	age int
}

func (p *Person) SetAge(age int) error {
	if age < 0 {
		return errors.New("年龄不能小于 0 ")
	}
	p.age = age
	return nil
}

上述代码定义了一个结构体 Person,此结构体包含一个 age 属性,一个 SetAge 方法,此方法只作用于 Person 结构体。我们可以看到,该方法包含六部分,分别为:

  • 1、关键字 声明方法时,必须以 func 关键字开头,还记得函数的声明吗,也是以这个关键字开头。
  • 2、receiver 部分 (p *Person) 这部分,在 Go 中称为 receiver 部分,里面的参数称为 receiver 参数,相比于函数,方法与其的声明区别就在于多了这一部分。
  • 3、方法名。 Go 推荐使用驼峰命名的方式,和变量的命名规则一样,首字母大写的方法名可以在包外访问,小写的只能在包内访问。
  • 4、参数列表 参数列表中声明了在方法体里所使用到的变量。参数列表位于方法名后面,用括号包裹着,多个参数使用逗号分隔开。
  • 5、返回值列表 返回值为函数执行后的一个结果,上述代码只有一个返回值,如果有多个返回值,需要用括号包裹着,返回值之间用逗号分隔开。
  • 6、方法体 大括号内就是方法体,存放着方法的具体实现。

方法的调用

通过 变量.方法名(参数) 的方式对方法进行调用。例如:

import (
	"errors"
	"fmt"
)

type Person struct {
	age int
}

func (p *Person) SetAge(age int) error {
	if age < 0 {
		return errors.New("年龄不能小于 0 ")
	}
	p.age = age
	return nil
}

func main() {
	person := Person{}
	err := person.SetAge(18)
	if err != nil {
		return
	}
	fmt.Println(person.age) // 18
}

创建一个 person 变量,然后调用 SetAge 函数。

Receiver 参数类型的选择

Receiver 部分,我们可以绑定值类型,也可以绑定指针类型,这两种类型什么时候使用呢?

如果方法体里不涉及到修改结构体变量的属性值,使用值类型

type Person struct {
        age int
}

func (p Person) GetAge() int {
        return p.age
}

对于 GetAge 方法,作用是返回年龄,没有涉及到修改年龄的操作,因此 receiver 部分,选择 Person 类型就可以。

如果方法体里有修改结构体变量的属性值的操作,使用指针类型

type Person struct {
	age int
}

func (p *Person) SetAge(age int) error {
	if age < 0 {
		return errors.New("年龄不能小于 0 ")
	}
	p.age = age
	return nil
}

SetAge 涉及到对结构体属性值修改的操作,因此 receiver 部分使用指针类型,通过指针,可以对所指向地址的变量进行修改操作。

方法的约束

Go 对方法声明的位置是有约束的,我们不能跨越包去声明一个类型的方法,根据这个特点我们可以发现:

不能为基本数据类型声明方法

因为基本数据类型所定义的位置,是不在我们所编码的包里面的。

不能跨越包为其他包的类型声明方法

这个是 Go 的所规定的的。

小结

本文介绍了 Go 方法的声明方式、组成部分和其与函数的不同点,同时指出Receiver 参数类型在不同场景下的选择,最后介绍了 Go 对方法约束的体现。

到此这篇关于一文带你了解Go语言中方法的调用的文章就介绍到这了,更多相关Go语言方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO excelize读取excel进行时间类型转换的示例代码(自动转换)

    GO excelize读取excel进行时间类型转换的示例代码(自动转换)

    我们经常会遇到如何自动识别excel中的时间类型数据并转化成对应的 "Y-m-d H:i:s"类型数据,本文小编给大家介绍了GO excelize读取excel进行时间类型转换的示例代码(自动转换),需要的朋友可以参考下
    2024-10-10
  • 一文带你熟悉Go语言中的for循环

    一文带你熟悉Go语言中的for循环

    这篇文章主要和大家分享一下Go语言中for循环的定义与使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-11-11
  • 一文带你吃透Golang中的类型转换

    一文带你吃透Golang中的类型转换

    Golang是一种强类型语言,所以Golang的类型转换和C/C++ java等语言的类型转换还有点区别,本文讲通过一些简单的示例带大家深入了解一下Golang中的类型转换,需要的可以参考下
    2023-05-05
  • 一文带你全面掌握Go语言中的正则表达式

    一文带你全面掌握Go语言中的正则表达式

    正则表达式是一种强大的模式匹配工具,能够在文本中进行灵活的搜索和替换操作,本文将介绍 Golang 中的正则表达式语法,包括常用的匹配符号、模式修饰符以及示例应用,希望对大家有所帮助
    2023-05-05
  • 解析Go 标准库 http.FileServer 实现静态文件服务

    解析Go 标准库 http.FileServer 实现静态文件服务

    http.FileServer 方法属于标准库 net/http,返回一个使用 FileSystem 接口 root 提供文件访问服务的 HTTP 处理器。下面通过本文给大家介绍Go 标准库 http.FileServer 实现静态文件服务的相关知识,感兴趣的朋友一起看看吧
    2018-08-08
  • 详解如何在Go中循环中使用Defer关键字示例详解

    详解如何在Go中循环中使用Defer关键字示例详解

    这篇文章主要为大家介绍了详解如何在Go中循环中使用Defer关键字示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 总结Go语言中defer的使用和注意要点

    总结Go语言中defer的使用和注意要点

    Go语言中的defer关键字实现比较特殊的功能,这篇文章给大家总结了关于Go语言中defer的使用和注意要点,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-09-09
  • golang hack插件开发动态链接库实例探究

    golang hack插件开发动态链接库实例探究

    这篇文章主要为大家介绍了golang hack插件开发动态链接库实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • golang 生成二维码海报的实现代码

    golang 生成二维码海报的实现代码

    这篇文章主要介绍了golang 生成二维码海报的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • go REST API设计模式和反模式示例解析

    go REST API设计模式和反模式示例解析

    在这篇文章中,我们将探讨一些常见的REST API设计模式和开发者应该注意的反模式,我们还将提供Golang和Open API Schema的代码片段来帮助说明这些概念,有需要的朋友可以借鉴参考下
    2023-09-09

最新评论