Golang学习笔记(十):方法

417 阅读2分钟

原创作者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。

传统编程语言,如Java,C++或PHP,对面向对象都提供了支持,一般的面向对象编程,主要是定义一个个抽象的类,然后再通过实例化一个个的对象,但是,Go语言虽然提供了面向对象的支持,但与传统语言并不相同,这可能是许多从其他编程语言转过来的程序员不太应Go语言的原因。

下面来讲讲Go对面向对象的支持有什么不同。

Go的面向对象

Go语言的面向对象定义,与其他语言不同。

传统编程语言是,每个对象,有自己的属性和方法,对象通过调用方法,来达到修改属性,改变对象状态。

而在Go语言中,每个类型或变量,都附加一些方法,然后通过调用方法来执行程序。

方法的声明

如何给类型声明一个方法呢?方法的形式与函数类似,只不过函数的func与函数之间加一个该类型变量,如下所示:

const male = 1
const female = 2
type User struct {
    Uid      int
    UserName string
    Sex      int //1:男,2:女
}

func (u User)GetSex()(sex int) {
    return u.Sex
}

在上面的例子中,变量u称为方法的接收器(receiver),也就是调用该方法的对象,与传统编程使用self或this表示调用对象不同,Go语言可以自定义接收器的名称,不过一般建议使用简称名称,如这里使用u


u := Uesr{Uid:10,UserName:"test",Sex:male}

fmt.Println(u.GetSex(female))//输出1

u.Sex = female

fmt.Println(u.GetSex(female))//输出2

在同一个包中,我们不能定义相同名称的函数,但方法不同,不同的类型变量可以定义相同的方法名,如下代码所示,我们定义的Admin结构也附加了GetSex()方法

type Admin struct {
    Id
    Name
    Sex
}

func (a *Admin)GetSex(sex int) {
    return u.Sex
}

还要注意的是,结构体在定义方法名时,方法名与结构的属性字段不能相同。


你的关注,是我写作路上最大的鼓励!