golang 方法及struct的匿名字段方法继承

/*
  go方法
  一般的函数定义叫做函数
  定义在结构提上面的函数叫做该结构体的方法
*/

package main

import (
    "fmt"
)

type rect struct {
    width  int
    height int
}

/*
   这个area方法有一个限定类型*rect
   表示这个函数是定义在rect结构体上的方法
*/

func (r *rect) area() int {
    return r.width * r.height
}

/*
   方法的定义限定类型可以为结构体类型
   也可以是结构体指针类型
   区别在于如果限定类型是结构体指针类型
   那么在该方法内部可以修改结构体成员信息
*/

func (r *rect) perim() int {
    return 2*r.width + 2*r.height
}

func main() {
    r := rect{width: 10, height: 5}
    r.area()
    r.perim()

    /*
        go语言会自动识别方法调用的参数是结构体变量还是结构体指针
        如果要修改结构体内部成员值那么使用结构体指针作为限定类型
        也就是说参数若是结构体变量仅仅会发生值拷贝
    */
    rp := &r
    rp.area()
    rp.perim()
}

/*
  方法是函数的语法糖
  当函数与某个特定的类型绑定那么他就是一个方法
  我们可以将方法还原成函数
*/

func main() {
    p := Person{2, "张三"}
    p.test()

    var f1 func(int) = p.test
    f1(2)

    Person.test(p, 3)
    var f2 func(Person, int) = Person.test
    f2(p, 4)
}

type Person struct {
    Id   int
    Name string
}

func (p *Person) test(x int) {
    fmt.Println(p.Id, p.Name)
}

/*
  使用匿名字段时 实现模拟继承
  即可以直接访问匿名字段的方法
  有隐藏规则
*/

func main() {
    p := Student{Person{}, 25}
    p.test()
}

type Person struct {
    Id   int
    Name string
}

/*
   知识点:
   struct 的匿名字段
   匿名字段的方法会被继承
*/
type Student struct {
    Person
    Score int
}

func (p *Person) test() {
    fmt.Println("person test")
}

func (s *Student) test() {
    fmt.Println("student test")
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值