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. time_t 是不定长的,如果写在superblocck里,要用定长的类型

    例如 time_t 变量在32位机上生成,在64位机上读出,这样两个连续的 time_t 变量(例如在结构体中),会变当成一个变量.

  2. js之用IndexOf返回指定字符串的次数

    代码 var Str = "strs,strs,stras,str,strs,strs"; var subStr ="strs" ; var count = 0 ...

  3. CTO为何要微服务评估

    为什么定义参考模型 之前我的工作,大部分时间都是聚焦在某个产品/团队,为他们提供微服务/DevOps的实施及指导.进入公司后,同时参与了多个产品团队的改造研讨.其中最大的不同在于: 在面对一个团队的时 ...

  4. Vue Cli 3 搭建单页应用项目刷新 404 问题 解决方案(以Apache为例)

    vue 项目 版本 Vue Cli 3.3 官方文档 https://router.vuejs.org/zh/guide/essentials/history-mode.html 因为本项目部署在 A ...

  5. .NET平台上的编译器不完全列表(转别)

    http://www.cnblogs.com/william_fire/archive/2005/05/15/155800.html最近因为开发需要,要研究一下.NET上基于C#扩展的编译器实现的框架 ...

  6. 如何理解Java的值传递

    结论 为了加深印象,先把结论放在文章开头. ++Java中只有值传递++. 形参与实参 在理解Java的值传递 实参Argument 实际参数,主调用函数传递给调用函数的参数 形参Parameter ...

  7. 数据库SQL语言从入门到精通--Part 5--E-R图(实体联系图)用来描述数据库图例

    数据库从入门到精通合集(超详细,学习数据库必看) E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. ...

  8. 刷新DNS解析缓存+追踪+域名解析命令

    刷新DNS解析缓存 命令:ipconfig /flushdns 用于改完host之后. 追踪IP: 命令:tracert www.baidu.com 域名解析: 命令:nslookup www.bai ...

  9. LCA 学习总结

    怎么说,LCA裸题直接套板子,大家都会做,这样的题没必要看,剩下的题发先LCA只是一个工具就像是搜索一样,只是一个工具而不是一种算法,所以借助这套工具在其图论问题如最长路,数据结构等问题上再去发挥作用 ...

  10. MySQL命令2

    索引与外键 // 添加索引 ALTER TABLE orders ADD KEY order_ix_custid(cust_id); // 删除索引 ALTER TABLE orders DROP K ...