在java语言里面,我们定义一个类之后,我们就可以再这个类里面任意定义属性和方法,示例如下:
package com.test; public class Student { private String name; private Integer age; private Boolean sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Boolean getSex() { return sex; } public void setSex(Boolean sex) { this.sex = sex; } }
这时候我们这些set/get方法定义的是public,在使用的时候就可以直接调用了,例如:
Student student = new Student(); student.getName();
是不是很方便。下面我们说下go语言。
在go语言中,我们经常会涉及到看到在一些方法声明里面,会带有一个小括号,小括号里面还带有*,示例如下:
那像这种函数方法是什么意思呢?其实这个带*的参数就是go语言里面的reciver参数。在go语言中,完整的函数方法的结构如下:
func (参数 *${reciver类型}) ${方法名}(参数1 ${参数类型},参数2 ${参数类型}) (${返回参数类型1},${返回参数类型2} ...){ 方法实现 }
所以我们在这里可以把这个reciver类型看作是对应的类。也就是说这个方法是属于对应类的,下面我们使用student的案例来列举额下:
首先我们定义一个student的类
type Student struct { name string age int sex bool }
然后我们定义一个GetStudentName的方法,它的reciver归属为Student,示例代码如下:
func (student *Student) GetStudentName() string { return student.name }
完整的定义如下:
最后我们在使用这个方法的时候,我们会直接在student对象上调用这个方法即可,示例代码如下:
func main() { s := Student{ name: "张三", age: 15, sex: true, } name := s.GetStudentName() fmt.Println(name) }
最后我们看下结果:
完整的运行了,并且获取了student这个对象的name值。
备注:
1、这里的reciver就是我们经常在方法上看到带*的某一段参数。
2、这里的reciver可以带*也可以不带*,所以在代码里面有时候我们看别人的代码是不带*的,但是我们建议在编写的时候带*,这样子可以很直观的看出来有reciver。
3、每一个方法对应的reciver只能有1个,不能有多个。
4、在这种reciver代码编写的时候,一定要注意下:带*穿的是引用的指针,不带*传的是值的副本。所以在有时候会看到带*和不带*执行后的结果是不一样的。
还没有评论,来说两句吧...