golang 中的内嵌(embeded)
2016-04-27 17:32
393 查看
内嵌与聚合: 外部类型只包含了内部类型的类型名, 而没有field 名, 则是内嵌。 外部类型包含了内部类型的类型名,还有filed名,则是聚合。聚合的在JAVA和C++都是常见的方式。而内嵌则是GO 的特有方式。
type Base struct {
basename string
}
type Derive struct { ---内嵌
Base
}
type Derive struct { 内嵌, 这种内嵌与上面内嵌的区别是什么,后面详细介绍
*Base
}
type Derive struct{ 聚合
base Base
}
内嵌的方式: 主要是通过结构体和接口的组合,有四种。
接口中内嵌接口 : 这里的做为内嵌接口的含义实际上还是指的一个定义,而不是接口的一个实例,相当于合并了两个接口定义的函数,只有同时了Writer和 Reader 接口,是可以说是实现了WRer接口,即才可以作为WRer的实例。
type Writer interface{
Write()
}
type Reader interface{
Read()
}
type WRer interface{
Reader
Writer
}
***********************************************************************************************************************
在接口中内嵌struct : 存在语法错误,并不具有实际的含义, 编译报错./person.go:22: interface contains embedded non-interface Person
Interface 不能嵌入非interface的类型。
*********************************************************************************************************************************
在结构体(struct)中内嵌 接口(interface)
1, 初始化的时候,内嵌接口要用一个实现此接口的结构体赋值
2,外层结构体中,只能调用内层接口定义的函数。 这是由于编译时决定。
3,外层结构体,可以作为receiver,重新定义同名函数,这样可以覆盖内层内嵌结构中定义的函数
4,如果上述第3条实现,那么可以用外层结构体引用内嵌接口的实例,并调用内嵌接口的函数
Type Printer interface{
Print()
}
Type CanonPrinter struct{
Printname string
}
Func (printer CanoPrinter) Print(){
Fmt.Println(“this iscannoprinter printing now”)
}
Type PrintWorker struct{
Printer
name string
age int
}
// 如果没有下面实现,则
Func (printworker PrintWorker) Print(){
Fmt.Println(“thisis printing from PrintWorker)
printworker.Printer.Print() // 这里 printworker
首先引用内部嵌入Printer接口的实例,然后调用Printer
接口实例的Print()方法
}
Func main(){
canon := CanonPrinter(“canoprint_num_1”)
printworker := PrintWorker{Printer:canon,name: “ansendong”, age: 34}
printworker.Print() //如果没有上述红色部分的实现,则这里只调用CanonPrinter实现的Print()方法。
}
**********************************************************************************************************************************
结构体(struct)中内嵌 结构体(struct)
1, 初始化,内嵌结构体要进行赋值
2,外层结构自动获得内嵌结构体所有定义的field和实现的方法(method)
3, 同上述结构体中内嵌接口类似,同样外层结构体可以定义同名方法,这样覆盖内层结构体的定义的方法。 同样也可以定义同名变量,覆盖内层结构体的变量
4,同样可以内层结构体引用,内层结构体重已经定义的方法和变量。
type Base struct {
basename string
}
type Derive struct { ---内嵌
Base
}
type Derive struct { 内嵌, 这种内嵌与上面内嵌的区别是什么,后面详细介绍
*Base
}
type Derive struct{ 聚合
base Base
}
内嵌的方式: 主要是通过结构体和接口的组合,有四种。
接口中内嵌接口 : 这里的做为内嵌接口的含义实际上还是指的一个定义,而不是接口的一个实例,相当于合并了两个接口定义的函数,只有同时了Writer和 Reader 接口,是可以说是实现了WRer接口,即才可以作为WRer的实例。
type Writer interface{
Write()
}
type Reader interface{
Read()
}
type WRer interface{
Reader
Writer
}
***********************************************************************************************************************
在接口中内嵌struct : 存在语法错误,并不具有实际的含义, 编译报错./person.go:22: interface contains embedded non-interface Person
Interface 不能嵌入非interface的类型。
*********************************************************************************************************************************
在结构体(struct)中内嵌 接口(interface)
1, 初始化的时候,内嵌接口要用一个实现此接口的结构体赋值
2,外层结构体中,只能调用内层接口定义的函数。 这是由于编译时决定。
3,外层结构体,可以作为receiver,重新定义同名函数,这样可以覆盖内层内嵌结构中定义的函数
4,如果上述第3条实现,那么可以用外层结构体引用内嵌接口的实例,并调用内嵌接口的函数
Type Printer interface{
Print()
}
Type CanonPrinter struct{
Printname string
}
Func (printer CanoPrinter) Print(){
Fmt.Println(“this iscannoprinter printing now”)
}
Type PrintWorker struct{
Printer
name string
age int
}
// 如果没有下面实现,则
Func (printworker PrintWorker) Print(){
Fmt.Println(“thisis printing from PrintWorker)
printworker.Printer.Print() // 这里 printworker
首先引用内部嵌入Printer接口的实例,然后调用Printer
接口实例的Print()方法
}
Func main(){
canon := CanonPrinter(“canoprint_num_1”)
printworker := PrintWorker{Printer:canon,name: “ansendong”, age: 34}
printworker.Print() //如果没有上述红色部分的实现,则这里只调用CanonPrinter实现的Print()方法。
}
**********************************************************************************************************************************
结构体(struct)中内嵌 结构体(struct)
1, 初始化,内嵌结构体要进行赋值
2,外层结构自动获得内嵌结构体所有定义的field和实现的方法(method)
3, 同上述结构体中内嵌接口类似,同样外层结构体可以定义同名方法,这样覆盖内层结构体的定义的方法。 同样也可以定义同名变量,覆盖内层结构体的变量
4,同样可以内层结构体引用,内层结构体重已经定义的方法和变量。
相关文章推荐
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- Golang实现的聊天程序服务端和客户端代码分享
- Golang学习笔记(三):控制流
- Golang学习笔记(二):类型、变量、常量
- Golang中的sync.WaitGroup用法实例
- Go语言struct类型介绍
- golang使用正则表达式解析网页
- Golang极简入门教程(三):并发支持
- php内嵌函数用法实例
- Golang极简入门教程(四):编写第一个项目
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
- 深入解析Go语言中for循环的写法
- Golang学习笔记(四):array、slice、map
- 理解Golang中的数组(array)、切片(slice)和map
- golang语言中for循环语句用法实例
- Golang学习笔记(一):简介
- golang操作mongodb的方法
- GO语言(golang)基础知识
- ubuntu下搭建Go语言(golang)环境