2.5 جاسازی تایپ (type embedding)

2.5 جاسازی تایپ (type embedding)

در زبان گو برای ساختار و اینترفیس امکان جاسازی تایپ وجود دارد. یعنی شما می‌توانید یک ساختار یا یک اینترفیس را داخل ساختار دیگر جاسازی کنید و یا داخل اینترفیس یک اینترفیس دیگر را جاسازی کنید.

 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}
1$ go run main.go
2Employee breathes
3Employee walk
4Employee speaks

یکی دیگه از مثال‌هایی که می‌توانیم بزنیم پکیج io اینترفیس ReadWriter هست که ۲ تا اینترفیس Reader و Writer داخل این اینترفیس جاسازی شده است.