Go 語言類型的內(nèi)嵌
在 Go 語言中的類型是可以直接內(nèi)嵌到結(jié)構(gòu)體中的,可以看作是一個(gè)沒有屬性名的屬性。同時(shí)接口中也可以內(nèi)嵌接口,并且只能內(nèi)嵌接口。本文就來講解以下 Go 語言如何使用內(nèi)嵌類型。
1. 結(jié)構(gòu)體內(nèi)嵌類型
結(jié)構(gòu)體中內(nèi)嵌類型在開發(fā)中用的并不多,這只是一個(gè)延伸特性。意味著結(jié)構(gòu)體在定義屬性字段的時(shí)候可以只寫類型,不寫屬性名,但是一個(gè)類型只能寫一個(gè),不然結(jié)構(gòu)體會(huì)無法識(shí)別你調(diào)用的時(shí)候使用的是哪個(gè)字段,這種只寫類型不寫屬性名的屬性被稱為匿名字段。
代碼示例:
- 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 行:結(jié)構(gòu)體中內(nèi)嵌了一個(gè)int類型;
- 第 12 行:給匿名字段賦值的時(shí)候直接使用其字段類型即可;
- 第 16 行:打印匿名字段的值。
執(zhí)行結(jié)果:

2. 結(jié)構(gòu)體內(nèi)嵌結(jié)構(gòu)體
結(jié)構(gòu)體內(nèi)嵌結(jié)構(gòu)體是用的最多的一種內(nèi)嵌方式。它有點(diǎn)類似于面向?qū)ο蛘Z言中的繼承,但是面向?qū)ο蟮脑O(shè)計(jì)原則中最好不要有多繼承。甚至于 java 這個(gè)面向?qū)ο笳Z言的老大哥,直接就是不允許多繼承的。所以 Go 語言中的內(nèi)嵌結(jié)構(gòu)體更好理解為組合。
代碼示例:
- 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 行:定義了兩個(gè)功能結(jié)構(gòu)體:打電話和拍照;
- 第 17~20 行:用打電話和拍照兩個(gè)功能結(jié)構(gòu)體,組合成為手機(jī)結(jié)構(gòu)體;
- 第 22~24 行:用拍照功能結(jié)構(gòu)體,組合成為平板電腦結(jié)構(gòu)體;
- 第 26~34 行:初始化兩個(gè)結(jié)構(gòu)體,并打印它們的功能。
執(zhí)行結(jié)果:

3. 接口內(nèi)嵌接口
接口內(nèi)嵌接口也是一個(gè)非常實(shí)用的特性,可以使用這個(gè)功能來使同一個(gè)結(jié)構(gòu)體,放在不同的接口中,而能使用的功能不同。常用的權(quán)限控制,對(duì)一個(gè)相同的數(shù)據(jù)結(jié)構(gòu),但是能操作的權(quán)限可以用接口分開。
代碼示例:
- 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 行:內(nèi)嵌一個(gè)讀接口到只讀接口中;
- 第 17~20 行:內(nèi)嵌讀和寫的接口到讀寫接口中;
- 第 22~30 行:定義一個(gè)接口體實(shí)現(xiàn)讀接口和寫接口。
執(zhí)行結(jié)果:

4. 小結(jié)
本文介紹了結(jié)構(gòu)體和接口的內(nèi)嵌類型。其中結(jié)構(gòu)體內(nèi)嵌結(jié)構(gòu)體和接口內(nèi)嵌接口最為常用。需要注意的是接口只能內(nèi)嵌接口,不可內(nèi)嵌其它類型。
文章來源于網(wǎng)絡(luò),侵刪!
