Go語言中結構體的使用 第2部分OOP

2021-08-30 15:31:17 字數 2361 閱讀 6310

結構體的基本語法請參見:go語言中結構體的使用-第1部分結構體。

結構體除了是乙個復合資料之外,還用來做物件導向程式設計。go 語言使用結構體和結構體成員來描述真實世界的實體和實體對應的各種屬性。也就意味著結構體型別可以模擬為其他語言中的「類class」, 而結構體資料可以模擬為其他語言中的 「物件」。

本文就說說結構體中,物件導向的部分。

在物件導向程式設計中,例項化物件時往往需要完成很多業務邏輯,例如初始資料合理性,獲取需要的資源等。在經典的oop程式中,都會提供構造方法,用於在例項化物件時完成特定功能。

go語言中,沒有class,因此沒有典型意義的構造方法。但我們可以定義乙個函式,用來例項化結構體物件,在函式內完成特定功能,實現建構函式的功能,這就是構造工廠函式。演示如下:

type product struct 

func newproduct(name string, price float64) *product

}// 需要 product 物件時:

p := newproduct("thinkpad t480", 8008)

注意,在oop程式設計中,通常認為物件是引用用傳遞,因此我們的建構函式返回的是*product同時函式內使用&product,這樣得到的物件為引用傳遞(go語言對結構體型別自動解析引用)。

若要為成員增加方法,需要在函式上定義接收器,用來接收呼叫該方法的成員物件。接收器定義如下:

func (p *product) sale()
語法中,(p *product)就是接收器。通過定義可知,該接收器可以讓函式接受乙個*product型別的引數,也就是呼叫該函式的物件。呼叫方法為:

pro := &product

// 當作成員去呼叫

// 呼叫時,將呼叫函式的 pro,作為引數傳遞給函式 run 的接收器 m。這樣就可以訪問 pro 物件了。

pro.sale()

同樣,物件導向中物件通常為引用型別,因此接收器的定義也是*product的引用型別。

go語言中結構體物件間的繼承,通過內嵌結構體語法實現。演示:

type product struct 

func (p *product) sale()

type book struct

定義 book 時,內嵌了 product 結構體。其中 book 稱為子結構體(派生,擴充套件),product成為父結構體(基礎)。例項化的 book 結構體物件,可以直接訪問 product 結構體中定義的成員包括屬性和方法。演示:

v := &book{}

// 訪問內嵌結構體屬性

v.name = "笑傲江湖"

v.author = "金庸"

// 呼叫內嵌結構體方法

v.sale()

內嵌還支援:

多繼承,可以同時內嵌多個結構體,稱之為多繼承。但要保證所繼承的結構體間沒有同名成員,否則出錯。

間接訪問,字結構體物件支援通過父結構體物件訪問繼承的成員,語法為v.product.name,效果與v.name一致。可以理解為是一種快捷語法。

直接初始化,可以直接為內嵌結構體提供初始化操作。演示為:

p := &book

author: "金庸"

}

在內嵌繼承中,若子與父結構體存在同名成員,例項化的子結構體成員,訪問到的是字結構體定義的成員。這個現象稱之為重寫override。演示:

type product struct 

func (p *product) sale()

type book struct

v := &book{}

// 訪問內嵌結構體屬性

// 以下**訪問的是 book 中定義的 price 屬性

v.price = 42.8

// 測試:

fmt.println(v.product.price) // 結果為 0

注意,繼承是乙個查詢 過程。先在當前結構體物件中查詢,如果沒有向內嵌結構體中查詢,直到最內層內嵌結構體。重寫就是由於在當前結構體物件中查詢到了,就不需要再去嵌入結構體物件中查詢了,不是乙個成員替換過程。

結構體,例項化,繼承,重寫示意圖如下:

以上就是結構體提供的關於oop中的語法。oop程式設計還會涉及到介面,反射等技術。

結構體第二部分完!

原文出自:小韓說課

Go語言中結構體的使用 第1部分結構體

結構體是由成員構成的復合型別。go 語言使用結構體和結構體成員來描述真實世界的實體和實體對應的各種屬性。結構體成員,也可稱之為成員變數,字段,屬性。屬性要滿足唯一性。結構體的概念在軟體工程上舊的術語叫 adt 抽象資料型別 abstract data type 資料層面,結構體是自定義資料型別,可以...

Go語言中的結構體

結構體中字段可以沒有名字,即匿名字段 struct中的每個字段,寫上乙個tag。這個tag可以通過反射的機制獲取到,最常用的場景就是json序列化和反序列化 package main import encoding json fmt type student struct func main 把這個...

go語言中結構體標籤的語法

原文 通過反射獲取結構體的成員型別 通過反射獲取值資訊 提示結構體標籤 struct tag 類似於 c 中的特性 attribute c 允許在類 字段 方法等前面新增 attribute,然後在反射系統中可以獲取到這個屬性系統。例如 conditional debug public static...