Go 语言类型的内嵌
在 Go 语言中的类型是可以直接内嵌到结构体中的,可以看作是一个没有属性名的属性。同时接口中也可以内嵌接口,并且只能内嵌接口。本文就来讲解以下 Go 语言如何使用内嵌类型。
1. 结构体内嵌类型
结构体中内嵌类型在开发中用的并不多,这只是一个延伸特性。意味着结构体在定义属性字段的时候可以只写类型,不写属性名,但是一个类型只能写一个,不然结构体会无法识别你调用的时候使用的是哪个字段,这种只写类型不写属性名的属性被称为匿名字段。
代码示例:
代码块
- 1
package main - 2
- 3
import "fmt" - 4
- 5
type Student struct { - 6
Name string - 7
Age int - 8
int - 9
} - 10
- 11
func newStudent(name string, age int) Student { - 12
return Student{Name: name, Age: age, int: 10} - 13
} - 14
func main() { - 15
stu := newStudent("Codey", 18) - 16
fmt.Println("匿名字段的值:", stu.int) - 17
}
- 第 8 行:结构体中内嵌了一个int类型;
- 第 12 行:给匿名字段赋值的时候直接使用其字段类型即可;
- 第 16 行:打印匿名字段的值。
执行结果:

2. 结构体内嵌结构体
结构体内嵌结构体是用的最多的一种内嵌方式。它有点类似于面向对向语言中的继承,但是面向对象的设计原则中最好不要有多继承。甚至于 java 这个面向对象语言的老大哥,直接就是不允许多继承的。所以 Go 语言中的内嵌结构体更好理解为组合。
代码示例:
代码块
- 1
package main - 2
- 3
import "fmt" - 4
- 5
type Callable struct{} - 6
- 7
func (c Callable) Call() { - 8
fmt.Println("can call") - 9
} - 10
- 11
type Photographic struct{} - 12
- 13
func (p Photographic) Photograph() { - 14
fmt.Println("can take photos") - 15
} - 16
- 17
type Moblie struct { - 18
Callable - 19
Photographic - 20
} - 21
- 22
type Pad struct { - 23
Photographic - 24
} - 25
- 26
func main() { - 27
var m Moblie - 28
fmt.Println("Moblie Function:") - 29
m.Call() - 30
m.Photograph() - 31
- 32
var p Pad - 33
fmt.Println("Pad Function:") - 34
p.Photograph() - 35
}
- 第 5~15 行:定义了两个功能结构体:打电话和拍照;
- 第 17~20 行:用打电话和拍照两个功能结构体,组合成为手机结构体;
- 第 22~24 行:用拍照功能结构体,组合成为平板电脑结构体;
- 第 26~34 行:初始化两个结构体,并打印它们的功能。
执行结果:

3. 接口内嵌接口
接口内嵌接口也是一个非常实用的特性,可以使用这个功能来使同一个结构体,放在不同的接口中,而能使用的功能不同。常用的权限控制,对一个相同的数据结构,但是能操作的权限可以用接口分开。
代码示例:
代码块
- 1
package main - 2
- 3
import "fmt" - 4
- 5
type Reader interface { - 6
Read() - 7
} - 8
- 9
type Writer interface { - 10
Write() - 11
} - 12
- 13
type OnlyReader interface { - 14
Reader - 15
} - 16
- 17
type ReaderAndWriter interface { - 18
Reader - 19
Writer - 20
} - 21
- 22
type file struct{} - 23
- 24
func (f file) Read() { - 25
fmt.Println("Read something") - 26
} - 27
- 28
func (f file) Write() { - 29
fmt.Println("Write something") - 30
} - 31
- 32
func main() { - 33
f := file{} - 34
var rAndW ReaderAndWriter - 35
rAndW = f - 36
rAndW.Read() - 37
rAndW.Write() - 38
- 39
var onlyR OnlyReader - 40
onlyR = f - 41
onlyR.Read() - 42
}
- 第 13~15 行:内嵌一个读接口到只读接口中;
- 第 17~20 行:内嵌读和写的接口到读写接口中;
- 第 22~30 行:定义一个接口体实现读接口和写接口。
执行结果:

4. 小结
本文介绍了结构体和接口的内嵌类型。其中结构体内嵌结构体和接口内嵌接口最为常用。需要注意的是接口只能内嵌接口,不可内嵌其它类型。
文章来源于网络,侵删!
