Golang 继承

优点

  • 代码扩展性强、便于重复利用

嵌套匿名结构体的基本语法

type Goods struct {

Name string

Price float64

}

type Books struct {

Goods

Author string

}

入门使用

package main

import "fmt"

// 定义一个商品结构体
type Goods struct {
    Name  string
    price float64
}

// 定义Goods方法
func (goods *Goods) GetInfo() {
    fmt.Printf("Name=%v,price=%v\n", goods.Name, goods.price)
}

// 定义一个图书结构体
type Books struct {
    Goods         // 嵌入Goods结构体
    Author string // 专属属性
}

// 图书结构体的绑定方法
func (books *Books) Read() {
    fmt.Println("腹有诗书气自华")
}

// 定义一个计算机结构体
type Computer struct {
    Goods        // 嵌入Goods结构体
    Cpu   string // 专属属性
}

func (computer *Computer) Calc() {
    fmt.Println("运算能力无可匹敌")
}

func main() {
    book := Books{}
    book.Goods.Name = "水浒传"
    book.Goods.price = 89.99
    book.Author = "吴承恩"
    book.GetInfo() // 调用继承来的公用方法
    book.Read()    // 调用私有方法

    computer := Computer{}
    computer.Name = "Apple Mac Pro"
    computer.price = 12999.00
    computer.Cpu = "Apple M2"
    computer.GetInfo() // 调用继承来的公用方法
    computer.Calc()    // 调用私有方法
}

特性

  • 结构体可以使用嵌套匿名结构体所有的属性、方法,即:首字母大写或小写的字段、方法,都可以使用

  • 匿名结构体字段、方法的访问可以简化

  • 当结构体和匿名结构体有相同的属性、方法时,编译器会采用就近访问的原则,如希望访问匿名结构体的属性、方法,可以通过匿名结构体名来区分

package main

import "fmt"

type A struct {
    Name string
}

func (a A) Hello() {
    fmt.Println("Name=", a.Name)
}

type B struct {
    A
    Name string // 存在与A结构体一样的属性
}

func main() {
    b := B{}
    b.Name = "宋江"
    b.Hello() // 会输出空,编译器会采用就近访问的原则,找A的Name,所以访问会空
    b.A.Name = "卢俊义"
    b.Hello() // 会输出:卢俊义
}
  • 结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的属性、方法(同时结构体本身没有同名的属性、方法),在访问时,就必须明确指定匿名结构体名字,否则会报错

  • 如果一个结构体嵌套了一个有名结构体,这种模式叫组合。如果是组合关系,那么在访问组合结构体的属性、方法时,必须带上结构体的名字

ackage main

import "fmt"

type A struct {
    Name string
}
type B struct {
    Name string
}
type C struct {
    AStruct A
    BStruct B
}

func main() {
    c := C{A{"宋江"}, B{"卢俊义"}}
    fmt.Println(c)
    fmt.Println(c.AStruct.Name)
    fmt.Println(c.BStruct.Name)
}
  • 嵌套匿名结构体后,也可以在创建结构体实例时,可以直接指定各个匿名结构体属性的值

package main

import "fmt"

type Goods struct {
    Name  string
    Price float64
}
type Brand struct {
    Name    string
    Address string
}
type Computer struct {
    GoodStruct  Goods
    BrandStruct Brand
}
type Computer2 struct {
    *Goods
    *Brand
}

func main() {
    // 定义方式一
    computer := Computer{}
    computer.GoodStruct.Name = "Apple Mac Pro"
    computer.GoodStruct.Price = 12999.99
    computer.BrandStruct.Name = "Apple"
    computer.BrandStruct.Address = "USA"
    fmt.Println(computer)
    // 定义方式二
    computer2 := Computer{
        Goods{"Apple Mac Pro~", 13999.99},
        Brand{"Apple~", "USA~"},
    }
    fmt.Println(computer2)
    // 定义方式三(推荐)
    computer3 := Computer{
        Goods{
            Name:  "Apple Mac Pro~~",
            Price: 14999.99,
        },
        Brand{
            Name:    "Apple~~",
            Address: "USA~~",
        },
    }
    fmt.Println(computer3)
    // 指针结构体
    computer4 := Computer2{
        &Goods{
            Name:  "Apple Mac Pro~~~",
            Price: 15999.99,
        },
        &Brand{
            Name:    "Apple~~~",
            Address: "USA~~~",
        },
    }
    fmt.Println(computer4)
    fmt.Println(*computer4.Goods)
    fmt.Println(*&computer4.Goods.Name)
    fmt.Println(*computer4.Brand)
    fmt.Println(*&computer4.Brand.Name)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值