6.2 Go 匿名字段

Golang匿名字段:可以像访问字段成员那样,访问匿名字段方法,go编译器自动查找。

package main

import "fmt"

type Student struct {
id int
name string
} type Teacher struct {
//匿名字段
Student
} func (s1 *Student) Play() {
fmt.Printf("Student地址:%p,值是%v\n", s1, s1)
fmt.Println("我是个学生,但是我就爱玩儿,你能奈我何")
}
func main() {
t1 := &Teacher{Student{1, "银角大王吧"}}
//两种方式一样效果
/*
t1 := &Teacher{
Student{
1,
"银角大王吧",
},
}
*/
fmt.Printf("t1的内存地址:%p\n", &t1)
//通过t1变量,执行结构体Student的方法,查找
t1.Play() // t1 -> Teacher -> *Student
}

通过匿名字段可以实现

重写 override

1.1. Go继承实战

写一个学生管理系统,学生类别有(小学生、中学生、大学生),既然是学生群体都可以(查询成绩、设置成绩)

package main

import "fmt"

//学生结构体
type Student struct {
Name string
Age int
Score int
} //显示学生个人信息方法,接收指针类型
func (stu *Student) ShowInfo() {
fmt.Printf("学生姓名:%v 年龄=%d 成绩=%d\n", stu.Name, stu.Age, stu.Score)
} //设置学生成绩
func (stu *Student) SetScore(score int) {
stu.Score = score
} //小学生群体 单词pupil
type Pupil struct {
//小学生的属性完全可以继承Student学生的属性
Student //继承匿名字段
} //小学生独有方法
func (p *Pupil) testing() {
fmt.Println("小学生正在考试中..")
} //大学生结构体,同样的也有学生的常见属性
type Graduate struct {
Student
} //大学生独有的方法
func (g *Graduate) testing() {
fmt.Println("大学生正在答辩考试中...")
} func main() {
p1 := &Pupil{Student{"小学生一号", 7, 99}}
p1.testing()
p1.ShowInfo()
p1.SetScore(100)
p1.ShowInfo()
fmt.Println("-----------")
g1 := &Graduate{Student{"大学生一号", 22, 50}}
g1.testing()
g1.ShowInfo()
g1.SetScore(60)
g1.ShowInfo()
}

继承给Go程序带来了代码的复用性提高了,代码的可维护性、扩展性更高了!

注意点:

如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现继承
如果一个struct嵌套了另一个【有名】的结构体,那么这个模式叫做组合

6.2 Go 匿名字段的更多相关文章

  1. 【Go入门教程4】struct类型(struct的匿名字段)

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...

  2. go之匿名字段

    struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段. 当匿名字段是一个struct的时候,那么这个struct所拥有的全部字 ...

  3. sql having 函数 按匿名字段作为条件进行查询

    今天写sql 遇到一个问题 SELECT a.*, count(b.id) AS nums FROM a LEFT JOIN b ON a.id=b.a_id WHERE nums>1 这时候会 ...

  4. 【Go入门教程6】struct类型(struct的匿名字段)

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样 ...

  5. go语言之进阶篇结构体指针类型匿名字段

    1.结构体指针类型匿名字段 示例: package main import "fmt" type Person struct { name string //名字 sex byte ...

  6. go语言之进阶篇非结构体匿名字段

    1.非结构体匿名字段 示例 : package main import "fmt" type mystr string //自定义类型,给一个类型改名 type Person st ...

  7. [GO]非结构体匿名字段

    package main import ( "fmt" ) type mystr string //给一个类型重命名 type Person struct { name strin ...

  8. [GO]匿名字段

    package main import ( "fmt" ) type Person struct { name string sex byte age int } type Stu ...

  9. GO学习笔记:struct的匿名字段

    我们上面介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段. 当匿名字段是一个struct的时候,那么这个 ...

  10. go结构体继承组合和匿名字段

    1.结构体方法 go不是纯粹的面向对象的,在go里面函数是一等公民,但是go也有结构体实现类似java一样类的功能来提供抽象.结构体的方法分为值方法和指针方法,前者在方法中做的改变不会改变调用的实例对 ...

随机推荐

  1. Data Flow Diagram with Examples - Customer Service System

    Data Flow Diagram with Examples - Customer Service System Data Flow Diagram (DFD) provides a visual ...

  2. JVM原理与深度调优(一)

    什么是jvm jvm是java虚拟机 运行在用户态.通过应用程序实现java代码跨平台.与平台无关.实际上是"一次编译,到处执行" 1.从微观来说编译出来的是字节码!去到哪个平台都 ...

  3. JDK14的新特性

    文章目录 虽然JDK13在今年的9月17号才发布,但是丝毫不会影响到下一个版本JDK14的开发工作.听说官方定的新功能马上就要官宣了,我们这里不妨来提前推断一下. 在9月17号的发布中,Oracle提 ...

  4. Redis数据迁移的三个方法

    为什么80%的码农都做不了架构师?>>>   1. rdb数据备份恢复方法 redis 127.0.0.1:6379> SAVE OK 或者 redis-cli -h 127. ...

  5. BurpSuite 扩展开发[1]-API与HelloWold

    园长 · 2014/11/20 15:08 0x00 简介 BurpSuite神器这些年非常的受大家欢迎,在国庆期间解了下Burp相关开发并写了这篇笔记.希望和大家分享一下JavaSwing和Burp ...

  6. Codeforce 1311A Add Odd or Subtract Even

    Add Odd or Subtract Even time limit per test2 seconds memory limit per test256 megabytes inputstanda ...

  7. POJ 3581 Prime Gap(二分)

    Prime Gap Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 11009 Accepted: 6298 Descriptio ...

  8. Linux 上搭建 Snort+BASE 入侵检测系统

    配置实验环境 由于本人电脑的存储空间不足,无法再承担安装一个虚拟机的开销,因此在阿里云上申请了一个云服务器进行本次实验.服务器配置如下: 1 核 - 2GB 内存 - 40GB 系统盘 操作系统:Ub ...

  9. Python网络数据采集- 创建爬虫

    1. 初见网络爬虫 1.1 网络连接 输出某个网页的全部 HTML 代码. urllib 是 Python 的标准库(就是说你不用额外安装就可以运行这个例子),包含了从网络请求数据,处理 cookie ...

  10. Linux下使用Rsync进行文件同步

    数据备份方案 1.需要备份的文件目录有(原则上,只要运维人员写入或更改的数据都需要备份)./data,/etc/rc.local,/var/spool/cron/root等,根据不同都服务器做不同的调 ...