struct

定义一个典型的面向对象方式

package main
import "fmt"

type Human struct {
    height float32
    weight int
}

func (h Human) BMIindex() (index int){
    index = h.weight / int(h.height * h.height)
    return
}

func main() {
    person := Human{1.83,75}
    fmt.Printf("this person's height is %.2f m\n",person.height)
    fmt.Printf("this person's weight is %d kg\n",person.weight)
    fmt.Printf("this person's BMI index is %d\n",person.BMIindex())
}

在main函数中我们初始化了一个Human对象,并分别读取了他们的属性height和weight,最后调用了Human对象的成员函数BMIindex(),通过计算获得了这个人的"体质指数"。

Receiver

method

下述又一个例子,我们希望通过定义成员函数来改变对象的成员属性。

package main
import "fmt"

type Human struct {
    height float32
    weight int
}

func (h Human) BMIindex() (index int){
    index = h.weight / int(h.height * h.height)
    return
}

func (h Human) setHeight(height float32) {
    h.height = height
}

func main() {
    person := Human{1.83,person.BMIindex())
    person.setHeight(1.90)
    fmt.Printf("this person's height is %.2f m\n",person.height)
}

输出结果:
    this person's height is 1.83 m
    this person's weight is 75 kg
    this person's BMI index is 25
    this person's height is 1.83 m

可以看出,我们调用person.setHeight(1.90)之后,person的height属性并没有改变为1.90。而为了解决这个问题,我们需要改变receiver。我们将setHeight()函数定义为下述形式即可。

func (h *Human) BMIindex() (index int){
    index = h.weight / int(h.height * h.height)
    return
}
指针类型

关于receiver的选择,可以这样理解,如果需要获取对象属性(get),则选用对象作为receiver;如果需要改变对象属性(set),则选取指针作为receiver。

method的适用范围

上述示例中,我们定义的method都是对应于struct的,但实际上method的定义可以依赖于所有的。所谓自定义类型,就是通过type语句给一些内置类型起了个"别名"后所定义的新类型。

package main
import "fmt"


type Sex string

func (s *Sex) change(){
    if *s == Sex("女") {
        *s = Sex("男")
    }
}

func main() {
    sex := Sex("女")
    fmt.Println("prevIoUs sex is ",sex)
    sex.change()
    fmt.Println("current sex is ",sex)    
}

这里,我们新定义了一个类型Sex,并且为其定义了一个method change()。

面向对象中的继承

package main
import "fmt"

type Human struct {
    height float32
    weight int
}

type Woman struct {
    Human
    sex string
}

func (h Human) BMIindex() (index int){
    index = h.weight / int(h.height * h.height)
    return
}

func main() {
    woman := Woman{Human{1.65,50},"女"}
    fmt.Printf("this woman's height is %.2f m\n",woman.height)
    fmt.Printf("this woman's wight is %d kg\n",woman.weight)
    fmt.Printf("this woman's BMIindex is %d\n",woman.BMIindex())
}
匿名字段重写

访问属性

大小写
包外部
包内部