1. 程式人生 >基礎教學 >Go語言入門 >33 Go 語言型別的內嵌

33 Go 語言型別的內嵌


1. 結構體內嵌型別

結構體中內嵌型別在開發中用的並不多,這只是一個延伸特性。意味著結構體在定義屬性欄位的時候可以只寫型別,不寫屬性名,但是一個型別只能寫一個,不然結構體會無法識別你呼叫的時候使用的是哪個欄位,這種只寫型別不寫屬性名的屬性被稱為匿名欄位。

程式碼示例:

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 行:結構體中內嵌了一個int型別;
  • 第 12 行:給匿名欄位賦值的時候直接使用其欄位型別即可;
  • 第 16 行:列印匿名欄位的值。

執行結果:

33 Go 語言型別的內嵌

2. 結構體內嵌結構體

結構體內嵌結構體是用的最多的一種內嵌方式。它有點類似於面向對向語言中的繼承,但是面向物件的設計原則中最好不要有多繼承。甚至於 java 這個面嚮物件語言的老大哥,直接就是不允許多繼承的。所以 Go 語言中的內嵌結構體更好理解為組合。

程式碼示例:

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 行:定義了兩個功能結構體:打電話和拍照;
  • 第 17~20 行:用打電話和拍照兩個功能結構體,組合成為手機結構體;
  • 第 22~24 行:用拍照功能結構體,組合成為平板電腦結構體;
  • 第 26~34 行:初始化兩個結構體,並列印它們的功能。

執行結果:

33 Go 語言型別的內嵌

3. 介面內嵌介面

介面內嵌介面也是一個非常實用的特性,可以使用這個功能來使同一個結構體,放在不同的介面中,而能使用的功能不同。常用的許可權控制,對一個相同的資料結構,但是能操作的許可權可以用介面分開。

程式碼示例:

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 行:內嵌一個讀介面到只讀介面中;
  • 第 17~20 行:內嵌讀和寫的介面到讀寫介面中;
  • 第 22~30 行:定義一個介面體實現讀介面和寫介面。

執行結果:

33 Go 語言型別的內嵌

4. 小結

本文介紹了結構體和介面的內嵌型別。其中結構體內嵌結構體和介面內嵌介面最為常用。需要注意的是介面只能內嵌介面,不可內嵌其它型別。