内容简介:理解 Go 语言中的方法和接收者
0x01 前言
Go 语言的语法实在有些不一样,与其它面向对象语言相比,Go 的方法似乎有些晦涩。
0x02 方法的定义
在 Go 语言里,方法和函数只差了一个,那就是方法在 func
和标识符之间多了一个参数。
type user struct {
name string,
email string,
}
//这是函数的定义
func notify(email string) {
fmt.Println("Email is %s", email)
}
//这是方法的定义
func (u user) notify(email string) {
fmt.Println("Email is %d", email)
}
我们可以看到,方法是在 func
和 notify
之间多了一个 user
类型的参数 u
,这个 u
就称作接收者。
0x03 接收者
接收者有两种,一种是值接收者,一种是指针接收者。顾名思义,值接收者,是接收者的类型是一个值,是一个副本,方法内部无法对其真正的接收者做更改;指针接收者,接收者的类型是一个指针,是接收者的引用,对这个引用的修改之间影响真正的接收者。像上面一样定义方法,将 user
改成 *user
就是指针接收者。
接收者与对象
相信有很多人看到这个接收者之后都很苦恼,到底这个接收者是什么,是干什么用的。我们在学习一门新的语言的时候,都讲究触类旁通,和我们已经了解的语言作对比。那么我们就通过拿 Go 和其它带有类的面向对象的语言做对比来搞清楚接收者是什么。这里我们用 php
来举例子。
在 php
中,我们要定义一个方法,首先是要定义一个类。
class User
{
protected $email;
protected $name;
poublic function __construct($name, $email)
{
$this->email = $email;
$this->name = $name;
}
public function notify()
{
echo "Email is {$email}.\n";
}
public function changeEmail($email)
{
$this->email = $email;
}
}
然后再实例化一个对象,进行操作,像这样。
$user = new User('daryl', 'daryl@example');
$user->changeEmail('daryl@example.com');
$user->notify();
接下来,我们参照着来写一下 Go 的方法定义。
首先,我们是先要定义一个类型,比如就是 user
好了,然后我们再定义方法。
type user struct {
name string
email string
}
func (u user) notify() {
fmt.Println("Email is %d", u.email)
}
func (u *user) changeEmail(email string) {
u.email = email
}
我们定义了两个方法,一个是 notify
,它是值接收者方法;还有一个是 changeEmail
,它是指针接收者方法。可以看到,值接收者方法,接收者是一个副本,无法修改;指针接收者是引用,可以修改。
我们再来看一下调用。
daryl := {"daryl", "daryl@oldexample.com"}
daryl.changeEmail("daryl@example.com")
daryl.notify()
看看,是不是很熟悉!对,就像我们刚刚写过的 php
代码一样,有没有! daryl
就是对象, name
和 email
就是属性, notify
和 changeEmail
就是它的方法。只是,不同的是,我们没有将它放到 class
中,而是用另外一种方式让它们结合了,有了关系!
关于值接收者和指针接收者,其实 Go 在编译的时候有一个隐式转换,将其转换为正确的接收者类型。就像下面这样。
//daryl.changeEmail("daryl@example.com")
(&daryl).changeEmail("daryl@example.com")
wife := &daryl
//wife.notify()
(*wife).notify()
0x04 后记
最近在学习 Go 语言,看到有很多人评价 Go 的语法很丑陋,这一点确实不可否认。但是,它的语法有很简单,对于熟悉 C 的人、熟悉含有类的面向对象的语言的人,稍加对比,就能发现其很多相似之处。
上面的都是我自己的拙见,如有错误或者不对的地方,非常欢迎指出!人生总是要不断地去学习嘛~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 关于在接收POST请求,Tomcat偶发性接收到的参数不全问题排查分析
- 异步接收MSMQ消息
- 如何突破商品期货Tick接收限制
- SpringMVC接收和响应json数据
- 如何使用 jq 接收 blob 数据
- 转的关于公众号接收信息的返回
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Out of their Minds
Dennis Shasha、Cathy Lazere / Springer / 1998-07-02 / USD 16.00
This best-selling book is now available in an inexpensive softcover format. Imagine living during the Renaissance and being able to interview that eras greatest scientists about their inspirations, di......一起来看看 《Out of their Minds》 这本书的介绍吧!