1. 程式人生 > 其它 >9.13Go之結構體之型別內嵌和結構體內嵌

9.13Go之結構體之型別內嵌和結構體內嵌

9.13Go之結構體之型別內嵌和結構體內嵌

型別內嵌和結構體內嵌的含義

概念:

  • 結構體可以包含一個或多個匿名(或內嵌)欄位--->這些欄位沒有顯式的名字,只有欄位的型別

  • 型別也就是欄位的名字。匿名欄位本身可以是一個結構體型別,即結構體可以包含內嵌結構體。

這個概念在C當中也是一樣的,這樣的概念類似於Java當中的類的繼承機制。可以使用父類的屬性和公開的方法

示例程式碼:

需求:

  • 實現一個結構體

  • 實現另一個結構體,內嵌第一個結構體和一個匿名結構體

  • 例項化第二個結構體來訪問第一個結構體當中的成員並且初始化他們

package main

import "fmt"

/*
定義一個內嵌結構體
*/
type inner struct {
num1 int
num2 int
}

/*
定義另一個外部結構體嵌入內嵌結構體
*/
type outer struct {
num3 int
num4 float64
//匿名結構體
int
//內嵌結構體
inner
}

func main() {
//例項化外部結構體
outer1 := new(outer)
//訪問變數並且選擇性的初始化
outer1.num3 = 30
outer1.int = 80
outer1.num1 = 20 //這個成員在inner當中
outer1.num2 = 30 //這個成員在inner當中
//列印結果
fmt.Printf("outer.num3 is:%d\n", outer1.num3)
fmt.Printf("outer.int is:%d\n", outer1.int)
fmt.Printf("outer.num1 is:%d\n", outer1.num2)
fmt.Printf("outer.num2 is:%d\n", outer1.num2)
fmt.Println("############################")
//使用結構體字面量賦值
outer2 := outer{6, 3.14, 60, inner{5, 8}}
fmt.Printf("outer2 is:", outer2)
}

內嵌結構體

概念:

  • 是一種資料型別,可以作為一個匿名欄位來使用

  • 外層結構體的例項可以直接進入內層結構體當中--->類似於繼承的概念

可以從另外一個或一些型別繼承部分或全部實現

示例程式碼:

package main

import "fmt"

/*
定義一個內嵌結構體
*/
type inner struct {
num1 int
num2 int
}

/*
定義另一個外部結構體嵌入內嵌結構體
*/
type outer struct {
num3 int
num4 float64
//匿名結構體
int
//內嵌結構體
inner
}

結構內嵌特性

  • 內嵌的結構體可以直接訪問其成員變數

    • 嵌入結構體的成員,可以通過外部結構體的例項直接訪問

    • 如果有多層可以層層訪問--->一次.下去

  • 內嵌結構體的欄位名是它的型別名

    • 示例程式碼:

    • var c Color
      c.BasicColor.R = 1
      c.BasicColor.G = 1
      c.BasicColor.B = 0

注意:

  • 一個結構體只能嵌入一個同類型的成員,編譯器在發現可能的賦值歧義時會報錯。

構體內嵌模擬類的繼承

概念:

  • 面向物件思想中,實現物件關係需要使用“繼承”特性。例如,人類不能飛行,鳥類可以飛行。人類和鳥類都可以繼承自可行走類,但只有鳥類繼承自飛行類。

  • java或者c#從語言設計層面就禁止了多繼承機制

Go語言的結構體內嵌特性就是一種組合特性

可以快速構建物件的不同特性

示例程式碼:

package main

import "fmt"

/*
定義一個飛行結構體--->和Java當中定義類不一樣,是一種存在於類之上的抽象的東西
*/
type Flying struct {

}

/*
定義這個飛行結構體能夠擁有的方法--->類似於Java中類的方法
由於結構體當中的特性,結構體當中只能夠定義成員不能夠定義函式
*/
func (f *Flying) Fly() {
fmt.Println("can fly")
}

/*
定義一個可行走的結構體--->行走類
*/
type Walking struct {

}

/*
定義這個行走結構體當中的方法
*/
func (w *Walking) Walk() {
fmt.Println("can walk")
}

/*
定義人類,人類能夠行走不能飛--->到這裡定義的人類的結構體才是類似於Java當中的類
內嵌的結構體相當於類當中的方法。只是Go當中使用了另外一種展現了面向物件的思想
*/
type Human struct {
Walking
}

/*
定義鳥類
*/
type Bird struct {
Flying
Walking
}

func main() {
//例項化人類
hu := new(Human)
fmt.Println("Human is:")
hu.Walk() //訪問到內嵌結構體當中的方法
fmt.Println("##########")
//例項化鳥類
br := new(Bird)
fmt.Println("Bird is:")
br.Fly()
br.Walk()
}

注意:

使用Go語言的內嵌結構體實現物件特性,可以自由地在物件中增、刪、改各種特性

It's a lonely road!!!