در زبان گو برای ساختار و اینترفیس امکان جاسازی تایپ وجود دارد. یعنی شما میتوانید یک ساختار یا یک اینترفیس را داخل ساختار دیگر جاسازی کنید و یا داخل اینترفیس یک اینترفیس دیگر را جاسازی کنید.
1
2type animal interface {
3 breathe()
4 walk()
5}
6
7type human interface {
8 animal
9 speak()
10}
11
12type base struct {
13 num int
14}
15
16type container struct {
17 human
18 base
19 str string
20}
در بالا ما اینترفیس animal را در اینترفیس human جاسازی کردیم و در ادامه داخل ساختار container اینترفیس human و ساختار base را جاسازی کردیم.
با اینکار ما به متدهای اینترفیس human و animal و همچنین به فیلدهای ساختار base دسترسی داریم و می توانیم از متدها و فیلدهای جاسازی با استفاده از ساختار container استفاده کنیم.
توجه کنید شما نمیتوانید یک ساختار را داخل اینترفیس جاسازی کنید.
2.5.1 جاسازی ساختار #
شما میتوانید هر چندتا ساختاری که دارید داخل یک ساختاری جاسازی و به هرکدام از فیلدهای ساختارهای جاسازی شده دسترسی دارید.
به مثال زیر توجه کنید :
1package main
2
3import "fmt"
4
5type base struct {
6 num int
7}
8
9func (b base) describe() string {
10 return fmt.Sprintf("base with num=%v", b.num)
11}
12
13type container struct {
14 base
15 str string
16}
17
18func main() {
19
20 co := container{
21 base: base{
22 num: 1,
23 },
24 str: "some name",
25 }
26
27 fmt.Printf("co={num: %v, str: %v}\n", co.num, co.str)
28
29 fmt.Println("also num:", co.base.num)
30
31 fmt.Println("describe:", co.describe())
32
33 type describer interface {
34 describe() string
35 }
36
37 var d describer = co
38 fmt.Println("describer:", d.describe())
39}
1$ go run main.go
2co={num: 1, str: some name}
3also num: 1
4describe: base with num=1
5describer: base with num=1
2.5.1.1 جاسازی اینترفیس در ساختار #
همانطور که گفتیم یک اینترفیس میتواند داخل یک ساختار جاسازی شود و همه متدهای اینترفیس به واسطه ساختار مورد قابل دسترس است و میتوانید هر یک از متدها را استفاده کنید.
1package main
2
3import "fmt"
4
5type animal interface {
6 breathe()
7 walk()
8}
9
10type dog struct {
11 age int
12}
13
14func (d dog) breathe() {
15 fmt.Println("Dog breathes")
16}
17
18func (d dog) walk() {
19 fmt.Println("Dog walk")
20}
21
22type pet1 struct {
23 a animal
24 name string
25}
26
27type pet2 struct {
28 animal
29 name string
30}
31
32func main() {
33 d := dog{age: 5}
34 p1 := pet1{name: "Milo", a: d}
35
36 fmt.Println(p1.name)
37 // p1.breathe()
38 // p1.walk()
39 p1.a.breathe()
40 p1.a.walk()
41
42 p2 := pet2{name: "Oscar", animal: d}
43 fmt.Println(p1.name)
44 p2.breathe()
45 p2.walk()
46 p1.a.breathe()
47 p1.a.walk()
48}
1$ go run main.go
2Milo
3Dog breathes
4Dod walk
5
6Oscar
7Dog breathes
8Dog walk
9Dog breathes
10Dog walk
2.5.2 جاسازی اینترفیس #
شما همانند ساختارها میتوانید اینترفیسها را جاسازی کنید و فقط کافیه اینترفیسها را داخل دیگر اینترفیسها جاسازی کنید تا متدهای اینترفیسهای جاسازی شده دسترسی داشته باشید.
1package main
2
3import "fmt"
4
5type animal interface {
6 breathe()
7 walk()
8}
9
10type human interface {
11 animal
12 speak()
13}
14
15type employee struct {
16 name string
17}
18
19func (e employee) breathe() {
20 fmt.Println("Employee breathes")
21}
22
23func (e employee) walk() {
24 fmt.Println("Employee walk")
25}
26
27func (e employee) speak() {
28 fmt.Println("Employee speaks")
29}
30
31func main() {
32 var h human
33
34 h = employee{name: "John"}
35 h.breathe()
36 h.walk()
37 h.speak()
38}
یکی دیگه از مثالهایی که میتوانیم بزنیم پکیج io اینترفیس ReadWriter هست که ۲ تا اینترفیس Reader و Writer داخل این اینترفیس جاسازی شده است.