go 面向对象编程

通过结构体可以定义一个组合字面量,有几个细节,也算是规则
规则一:当最后一个字段和结果不在同一行时,, 不可省略。

xm := Profile{
    name: "小明",
    age: 18,
    gender: "male",
}

反之,在同一行,就可以省略。

xm := Profile{
    name: "小明",
    age: 18,
    gender: "male"}

规则二:字段名要全写,要么全不写,不能有的写,有的不写。

例如下面这种写法是会报 mixture of field:value and value initializers 错误的

xm := Profile{
    name: "小明",
    18,
    "male",
}

规则三:初始化结构体,并不一定要所有字段都赋值,未被赋值的字段,会自动赋值为其类型的零值。
2. 绑定方法
在 Go 语言中,我们无法在结构体内定义方法,那如何给一个结构体定义方法呢,答案是可以使用组合函数的方式来定义结构体方法。它和普通函数的定义方式有些不一样,比如下面这个方法

func (person Profile) FmtProfile() {
    fmt.Printf("名字:%s\n", person.name)
    fmt.Printf("年龄:%d\n", person.age)
    fmt.Printf("性别:%s\n", person.gender)
}

其中FmtProfile 是方法名,而(person Profile) :表示将 FmtProfile 方法与 Profile 的实例绑定。我们把 Profile 称为方法的接收者,而 person 表示实例本身,它相当于 Python 中的 self,在方法内可以使用 person.属性名 的方法来访问实例属性。

方法的参数传递方式
当你想要在方法内改变实例的属性的时候,必须使用指针做为方法的接收者。
两种定义方法的方式:

  • 以值做为方法接收者

  • 以指针做为方法接收者

那我们如何进行选择呢?以下几种情况,应当直接使用指针做为方法的接收者。

你需要在方法内部改变结构体内容的时候

出于性能的问题,当结构体过大的时候

  • 有些情况下,以值或指针做为接收者都可以,但是考虑到代码一致性,建议都使用指针做为接收者。
posted @ 2023-03-16 20:53  codestacklinuxer  阅读(16)  评论(0编辑  收藏  举报