第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程
首頁 慕課教程 Go 入門教程 Go 入門教程 33 Go 語言類型的內(nèi)嵌

在 Go 語言中的類型是可以直接內(nèi)嵌到結(jié)構(gòu)體中的,可以看作是一個沒有屬性名的屬性。同時接口中也可以內(nèi)嵌接口,并且只能內(nèi)嵌接口。本文就來講解以下 Go 語言如何使用內(nèi)嵌類型。

1. 結(jié)構(gòu)體內(nèi)嵌類型

結(jié)構(gòu)體中內(nèi)嵌類型在開發(fā)中用的并不多,這只是一個延伸特性。意味著結(jié)構(gòu)體在定義屬性字段的時候可以只寫類型,不寫屬性名,但是一個類型只能寫一個,不然結(jié)構(gòu)體會無法識別你調(diào)用的時候使用的是哪個字段,這種只寫類型不寫屬性名的屬性被稱為匿名字段。

代碼示例

package main

import "fmt"

type Student struct {
    Name string
    Age  int
    int
}

func newStudent(name string, age int) Student {
    return Student{Name: name, Age: age, int: 10}
}
func main() {
    stu := newStudent("Codey", 18)
    fmt.Println("匿名字段的值:", stu.int)
}
  • 第 8 行:結(jié)構(gòu)體中內(nèi)嵌了一個int類型;
  • 第 12 行:給匿名字段賦值的時候直接使用其字段類型即可;
  • 第 16 行:打印匿名字段的值。

執(zhí)行結(jié)果:

圖片描述

2. 結(jié)構(gòu)體內(nèi)嵌結(jié)構(gòu)體

結(jié)構(gòu)體內(nèi)嵌結(jié)構(gòu)體是用的最多的一種內(nèi)嵌方式。它有點類似于面向?qū)ο蛘Z言中的繼承,但是面向?qū)ο蟮脑O(shè)計原則中最好不要有多繼承。甚至于 java 這個面向?qū)ο笳Z言的老大哥,直接就是不允許多繼承的。所以 Go 語言中的內(nèi)嵌結(jié)構(gòu)體更好理解為組合。

代碼示例:

package main

import "fmt"

type Callable struct{}

func (c Callable) Call() {
    fmt.Println("can call")
}

type Photographic struct{}

func (p Photographic) Photograph() {
    fmt.Println("can take photos")
}

type Moblie struct {
    Callable
    Photographic
}

type Pad struct {
    Photographic
}

func main() {
    var m Moblie
    fmt.Println("Moblie Function:")
    m.Call()
    m.Photograph()

    var p Pad
    fmt.Println("Pad Function:")
    p.Photograph()
}
  • 第 5~15 行:定義了兩個功能結(jié)構(gòu)體:打電話和拍照;
  • 第 17~20 行:用打電話和拍照兩個功能結(jié)構(gòu)體,組合成為手機結(jié)構(gòu)體;
  • 第 22~24 行:用拍照功能結(jié)構(gòu)體,組合成為平板電腦結(jié)構(gòu)體;
  • 第 26~34 行:初始化兩個結(jié)構(gòu)體,并打印它們的功能。

執(zhí)行結(jié)果:

圖片描述

3. 接口內(nèi)嵌接口

接口內(nèi)嵌接口也是一個非常實用的特性,可以使用這個功能來使同一個結(jié)構(gòu)體,放在不同的接口中,而能使用的功能不同。常用的權(quán)限控制,對一個相同的數(shù)據(jù)結(jié)構(gòu),但是能操作的權(quán)限可以用接口分開。

代碼示例

package main

import "fmt"

type Reader interface {
    Read()
}

type Writer interface {
    Write()
}

type OnlyReader interface {
    Reader
}

type ReaderAndWriter interface {
    Reader
    Writer
}

type file struct{}

func (f file) Read() {
    fmt.Println("Read something")
}

func (f file) Write() {
    fmt.Println("Write something")
}

func main() {
    f := file{}
    var rAndW ReaderAndWriter
    rAndW = f
    rAndW.Read()
    rAndW.Write()

    var onlyR OnlyReader
    onlyR = f
    onlyR.Read()
}
  • 第 13~15 行:內(nèi)嵌一個讀接口到只讀接口中;
  • 第 17~20 行:內(nèi)嵌讀和寫的接口到讀寫接口中;
  • 第 22~30 行:定義一個接口體實現(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)嵌其它類型。