[TOC]
## 结构体嵌套
一个结构体中可以嵌套包含另一个结构体或结构体指针
访问嵌套结构体的成员变量有两种
- 结构体.嵌套结构体.成员变量
- 结构体.成员变量 (嵌套结构体之间的成员变量名一致,则不可以使用该方法)
```go
// Person 是人的结构体
// Person 嵌套 Address 结构体
type Person struct {
name string
age int8
*Address // 匿名变量。Province Province
}
// Address 是地址的结构体
type Address struct {
Province string
City string
}
// NewPerson 是初始化构造 Person 结构体
func NewPerson(name string, age int8, address *Address) *Person {
return &Person{
name: name,
age: age,
Address: address,
}
}
func main() {
p1 := NewPerson("jiaxzeng", 18, &Address{"guangdong", "guangzhou"})
fmt.Printf("p1: %#v\n", p1)
fmt.Printf("Province: %#v\n", p1.Address.Province)
// 省略写嵌套的结构体,也是可以获取到成员变量。
// 查找成员变量顺序:先在结构体是否存在,存在则返回。不存在的话。找(所有)嵌套结构体是否存在。存在则返回。不存在则报错。
// 如果多个嵌套结构有重发的成员变量,则需要指定使用哪个嵌套结构体
fmt.Printf("city: %#v\n", p1.City)
}
// 运行结果
// p1: &main.Person{name:"jiaxzeng", age:18, Address:(*main.Address)(0xc00006a020)}
// Province: "guangdong", city: "guangzhou"
```
## 结构体继承
嵌套结构体有的方法。结构体都可以调用到。例如上述代码添加两个方法,梦想的方法给 person 结构体,获奖的方法给 Address 嵌套结构体。
```go
// Person 是人的结构体
// Person 嵌套 Address 结构体
type Person struct {
name string
age int8
*Address // 匿名变量。Province Province
}
// Address 是地址的结构体
type Address struct {
Province string
City string
}
// NewPerson 是初始化构造 Person 结构体
func NewPerson(name string, age int8, address *Address) *Person {
return &Person{
name: name,
age: age,
Address: address,
}
}
// Dream 是 *Person 结构体的梦想方法
func (p *Person) Dream(d string) {
fmt.Printf("%s 的梦想是 %s\n", p.name, d)
}
// Award 是 *Address 结构体的获奖方法
func (a *Address) Award() {
fmt.Printf("%s获奖啦!!!\n", a.City)
}
func main() {
p1 := NewPerson("jiaxzeng", 18, &Address{"guangdong", "guangzhou"})
p1.Dream("学好Golang语言")
// Person实例化调用梦想的方法(继承Address结构体)
p1.Award()
}
// 运行结果
// jiaxzeng 的梦想是 学好Golang语言
// guangzhou获奖啦!!!
```
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra