首页 > 其他分享 >一文了解 Go 方法

一文了解 Go 方法

时间:2022-12-03 12:03:15浏览次数:58  
标签:return 一文 int age Person 了解 Go 方法

耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,今天分享的知识是 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​​ 对方法约束的体现。

标签:return,一文,int,age,Person,了解,Go,方法
From: https://blog.51cto.com/u_15878295/5904283

相关文章

  • GOM原版登陆器微端设置与纯微端设置的方式是什么?
    先说明一下:下面的问题只对本站的原版GOM引擎GOM登陆器有用,使用坡解版或者第三方登陆器包括绿盟登陆器及GOMPJ的登陆器还有现在新出的各种GOM引擎登陆器都是无效的,所以,在解决......
  • 一文拿捏点互信息(PMI)解决词分布式表示稀疏性问题
    前馈知识之前在wordembedding里浅浅的说了一下one-hot是怎么向词向量表示发展的,大家可以回顾一下。接下来我补充一下,接说二者之间还有一个阶段,词的分布式表示。词的分布......
  • Google Chrome 自定义快捷键
    1.chrome应用商店下载插件Shortkeys   2.进入chrome扩展自定义快捷键功能页面:chrome://extensions/shortcuts。找到自己想要修改的快捷键,点击小铅笔完成修改,即......
  • 一文理解什么是DevOps,通俗易懂白话文
    一文理解什么是DevOps,通俗易懂白话文 devops是什么❝DevOps维基百科定义DevOps(Development和Operations的组合词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)......
  • windows 下 goprotobuf 的安装与使用
    安装protoc下载​​protoc-3.11.2-win64.zip​​压缩包​​https://github.com/protocolbuffers/protobuf/releases​​将文件解压到某一文件夹。如:​​C:\soft\protoc......
  • 【Django学习】加载site-packages下的template
      TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates',#'DIRS':['frontend/dist'],'DIRS':[os.path.join......
  • golang的单引号、双引号、反引号区别
    1、单引号在go语言中表示golang中的rune(int32)类型,byte(int8别称),单引号里面是单个字符,对应的值为改字符的ASCII值。Unicode是ASCII(美国信息交换标准码)字符编码的一个扩展......
  • Go-07 Golang中的数组
    packagemainimport"fmt"/*...Golang中的数组...*//* Go语言中的数组是指一系列相同类型数据的集合。数组中的元素必须要相同数据类型。数组中包含的每个数据被称......
  • samba启动不了解决办法
    步骤一:在ubuntu14.04下如何配置samba就不多说了,我的问题是配置完成以后,从windows访问共享目录,都连上了,但是点开share文件夹却弹出没有权限访问的对话框。如下图所示:这个......
  • 【SpringBoot】个性化banner.txt了解一下?
    在上手springboot之后,可以看到在启动的时候,控制台会打印出关于springboot的信息,也就是显示出来SpringBoot默认的信息(横幅)。在springboot的官方文档中指出,可以自定义属于自......