久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

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ò),侵刪!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!

    1. 主站蜘蛛池模板: 福建省| 嘉义市| 舞钢市| 鲁山县| 达孜县| 万盛区| 嘉兴市| 藁城市| 吉隆县| 河津市| 五莲县| 绵阳市| 白玉县| 成都市| 淅川县| 淮南市| 彭水| 卓尼县| 清水县| 察隅县| 通河县| 伽师县| 洛阳市| 奉化市| 墨玉县| 全椒县| 米脂县| 伊通| 福安市| 贵港市| 南岸区| 红河县| 科技| 连南| 德令哈市| 松桃| 从化市| 新巴尔虎右旗| 伊金霍洛旗| 天津市| 昌乐县|