【Go】Go語言繼承-多態模擬

  1. 繼承(結構體嵌入)
  2. 多態(接口實現和空接口)

1. 繼承(結構體嵌入)

Go 語言沒有傳統的面向對象的繼承機制,但可以通過“結構體嵌入”實現類似繼承的效果。

  • 結構體嵌入:在結構體中嵌入另一個結構體,使得子結構體可以直接訪問父結構體的字段和方法。
  • 字段重寫:若子結構體定義了與嵌入的結構體同名的字段,則可以認為“重寫”了父結構體的同名字段,訪問時默認訪問子結構體自己的字段,若需要訪問父結構體的字段,則使用 StructName.FieldName

代碼示例:

// 文件名: 03_inheritance.go
package mainimport "fmt"// 定義父類結構體 Person1
type Person1 struct {name stringage  int
}// 定義另一個父類結構體 Person2(用于展示多個繼承時的處理,字段沖突時需要顯式區分)
// type Person2 struct {
// 	name string
// 	age  int
// }// 定義子類結構體 Teacher,通過嵌入 Person1 來實現繼承
type Teacher struct {Person1 // 嵌入 Person1,實現繼承// 如果想繼承多個,則可以嵌入 Person2,但注意字段會沖突,需要通過顯式調用來區分// Person2 // 多繼承示例subject stringname    int // 子類中重寫了 name 字段(此字段會覆蓋 Person1 中的同名字段)
}// 為 Person1 定義一個方法
func (p *Person1) Hello() {fmt.Println("I am Person1....")
}func main() {// 通過字面量實例化 Teacher,初始化 Person1 部分和子類特有字段t2 := Teacher{Person1: Person1{"zhangsan", 12},subject: "math",}fmt.Printf("t2: %+v\n", t2)// 先實例化一個 Person1 對象,然后將其賦值給 Teacher 的 Person1 字段p1 := Person1{"mikodo", 19}t3 := Teacher{Person1: p1, subject: "golang"}fmt.Printf("t3: %+v\n", t3)// 調用繼承的方法t2.Hello()       // 等效于 t2.Person1.Hello()// 演示字段重寫t2.name = 100                // 修改 Teacher 中的 name 字段(子類自己的字段)t2.Person1.name = "luobozi"  // 修改嵌入的 Person1 的 name 字段fmt.Printf("t2 after change: %+v\n", t2)
}

說明:

  • 結構體 Teacher 嵌入了 Person1,因此可以直接調用 Person1 的方法,如 Hello()
  • 子類 Teacher 定義了自己的 name 字段,這樣在訪問時默認訪問的是 Teacher.name;如需要訪問父結構體中的 name 則使用 Teacher.Person1.name

2. 多態

Go 語言多態主要通過接口(interface)實現。

  • 接口定義:接口定義了一組方法,任何實現了這些方法的類型都被視為該接口類型。
  • 鴨子類型:Go 的多態不關心具體類型,只關心是否具有接口所需的方法。
  • 空接口:空接口 interface{} 可以表示任意類型,相當于其他語言的 Object 類型。

代碼示例:

// 文件名: 03_polymorphism.go
package mainimport "fmt"// 定義 MoneyPay 接口,要求實現 pay 方法
type MoneyPay interface {pay()
}// 定義空接口類型(可以代表任何數據類型)
type kong interface{}// 定義 ZFB 結構體,代表支付寶
type ZFB struct {name string
}// 定義 WX 結構體,代表微信
type WX struct {name string
}// 為 ZFB 綁定方法,實現 MoneyPay 接口
func (z *ZFB) pay() {fmt.Println("this is zfb pay")
}// 為 WX 綁定方法,實現 MoneyPay 接口
func (w *WX) pay() {fmt.Println("this is wx pay")
}// 定義函數 FinPay,接收 MoneyPay 接口類型的參數
func FinPay(p MoneyPay) {p.pay()
}func main() {// 實例化支付寶和微信對象(均為指針類型)z1 := &ZFB{"支付寶"}w1 := &WX{"微信"}// 接口變量可以接收實現該接口的任何對象var j1, j2 MoneyPayj1 = z1j2 = w1fmt.Println("j1 and j2:", j1, j2)// 通過接口調用支付方法,實現多態FinPay(z1)FinPay(w1)// 空接口示例,空接口可以保存任意類型的數據m1 := map[string]kong{"name": "luobozi","age":  18,}fmt.Println("空接口 map:", m1)// 類型斷言:將空接口中的數據轉換為具體類型,然后進行計算result := m1["age"].(int) + 10fmt.Println("斷言后計算結果:", result)
}

說明:

  • 接口 MoneyPay 定義了 pay() 方法,ZFBWX 結構體分別通過指針接收者實現了該方法,從而都滿足 MoneyPay 接口。
  • 函數 FinPay 接收接口類型參數,可以接受任何實現了 pay() 方法的類型,體現多態性。
  • 空接口 kong 可以存放任意數據,通過類型斷言可以獲取具體類型值。

總結

本篇代碼整理涵蓋了 Go 語言中“繼承和多態”的相關知識點:

  1. 繼承(結構體嵌入)

    • 利用結構體嵌入實現類似繼承的效果
    • 字段重寫示例:子類中定義同名字段覆蓋父類字段
    • 調用嵌入結構體的方法
  2. 多態

    • 通過接口定義多態行為,只要類型實現了接口方法,就能被當作該接口類型使用
    • 演示了如何使用空接口存儲任意類型數據,并通過類型斷言獲取具體類型

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74277.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kotlin知識體系(四) : inline、noinline、crossinline 關鍵字對應編譯后的代碼是怎樣的 ?

kotlin中inline、noinline、crossinline 關鍵字的作用 在 Kotlin 里,inline、noinline 和 crossinline 這幾個關鍵字和高階函數緊密相關,它們能夠對高階函數的行為進行優化和控制。下面為你詳細闡述它們的作用和原理。 inline 關鍵字 inline 關鍵字用…

LabVIEW FPGA與Windows平臺數據濾波處理對比

LabVIEW在FPGA和Windows平臺均可實現數據濾波處理,但兩者的底層架構、資源限制、實時性及應用場景差異顯著。FPGA側重硬件級并行處理,適用于高實時性場景;Windows依賴軟件算法,適合復雜數據處理與可視化。本文結合具體案例&#x…

深度解析 Android Matrix 變換(二):組合變換 pre、post

前言 在上一篇文章中,我們講解了 Canvas 中單個變換的原理和效果,即縮放、旋轉和平移。但是單個旋轉僅僅是基礎,Canvas 變換最重要的是能夠隨意組合各種變換以實現想要的效果。在這種情況下,就需要了解如何組合變換,以…

Java并發編程之CountDownLatch

1. 基本原理 計數器 CountDownLatch 在創建時需要指定一個初始計數值。這個值通常代表需要等待完成的任務數或線程數。 等待與遞減 等待:調用 await() 方法的線程會被阻塞,直到計數器變為 0。遞減:每當一個任務完成后,應調用 cou…

C++|GLog開源庫的使用 如何實現自定義類型消息日志

參考: C glog使用教程與代碼演示 C第三方日志庫Glog的安裝與使用超詳解 GLOG從入門到入門 glog 設置日志級別_glog C版本代碼分析 文章目錄 日志等級自定義消息創建使用宏定義 日志等級 在 glog 中,日志的嚴重性是通過 LogSeverity 來區分的&#xff0c…

FAQ - VMware vSphere Web 控制臺中鼠標控制不了怎么辦?

問題描述 在VMware vSphere vCenter Server 的 Web 控制臺中新建了一臺 Windows Server 2008 R2 虛擬機,但是鼠標進入控制臺后,可以看見鼠標光標,但是移動卻沒有反應。 根因分析 暫無。 解決方案 選中虛擬機>操作>編輯設置>添加新…

Rust+WebAssembly:開啟瀏覽器3D渲染新時代

引言 在當今的 Web 開發領域,隨著用戶對網頁交互體驗的要求日益提高,3D 渲染技術在 Web 應用中的應用愈發廣泛。從沉浸式的 Web 游戲,到逼真的虛擬展示場景,3D 渲染引擎承擔著將虛擬 3D 世界呈現到用戶瀏覽器中的關鍵任務。其性能…

在小米AX6000中添加tailscale monitor

經過測試,發現小米路由器中的tailscale可能會因為某種原因狀態異常, 為了讓tailscale恢復正常,所以又寫了monitor用來監控: #!/bin/sh# Define Tailscale related paths TAILSCALED_PATH"/tmp/tailscale/tailscale_1.80.3_a…

表達式括號匹配(stack)(信息學奧賽一本通-1353)

【題目描述】 假設一個表達式有英文字母(小寫)、運算符(,—,?,/)和左右小(圓)括號構成,以“ ”作為表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號…

IM 基于 WebRtc 視頻通信功能

IM(即時通訊)基于 WebRTC(Web Real-Time Communication,網頁實時通訊) 原理 WebRTC 是一種支持網頁瀏覽器進行實時語音通話或視頻通話的技術,它提供了一組 JavaScript API,使得在瀏覽器之間無…

關于極端場景下,數據庫更新與 MQ 消息一致性保障方案的詳細總結

目錄 一、核心問題場景 二、RocketMQ 事務消息方案 1. 核心機制 2. 執行流程 3. 關鍵優勢 4. 局限性 三、消息表方案 1. 核心機制 2. 執行流程 3. 關鍵優勢 4. 局限性 四、方案對比與選擇 五、實施建議 六、總結 一、核心問題場景 當數據庫更新后,若 MQ 消息未…

【設計模式】單件模式

七、單件模式 單件(Singleton) 模式也稱單例模式/單態模式,是一種創建型模式,用于創建只能產生 一個對象實例 的類。該模式比較特殊,其實現代碼中沒有用到設計模式中經常提起的抽象概念,而是使用了一種比較特殊的語法結構&#x…

【redis】主從復制:拓撲結構、原理和psync命令解析

文章目錄 拓撲一主一從相關問題 一主多從相關問題 樹形主從結構相關問題 主從復制原理復制流程 psync 命令命令解析replicatonidoffset總結 運行流程 拓撲 若干個節點之間按照什么樣的方式來進行組織連接 一主一從 都可以讀,從節點可以幫主節點分擔一部分的壓力只…

[RoarCTF 2019]Easy Calc-3.23BUUCTF練習day5(2)

[RoarCTF 2019]Easy Calc-3.23BUUCTF練習day5(2) 解題過程 查看源碼 發現calc.php頁面,訪問一下 分析代碼 首先獲取$_GET[num]的值并賦給變量$str。然后定義了一個黑名單數組$blacklist,包含了一系列被禁止的字符或轉義字符,如空格、制表…

阻塞隊列:原理、應用及實現

阻塞隊列:原理、應用及實現 什么是阻塞隊列以生產消費者模型形象地理解阻塞隊列阻塞隊列實現生產消費者模型模擬實現阻塞隊列實現生產消費者模型 什么是阻塞隊列 阻塞隊列是一種特殊且實用的隊列數據結構,它同樣遵循 “先進先出” 的原則。與普通隊列不…

【開源寶藏】30天學會CSS - DAY5 第五課 脈沖動畫

以下是一個完整的漸進式教程,拆解如何用 HTML CSS 構建“Pulsar”水波脈沖動畫。通過閱讀,你將理解每個核心屬性與關鍵幀如何配合,讓一個小圓不斷散發動態波紋,并且文字始終停留在圓心。 第 0 步:項目概覽 文件結構示…

2060 裁紙刀

2060 裁紙刀 ??難度:簡單 🌟考點:2022、規律、思維 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 100010…

TextView、AppCompatTextView和MaterialTextView該用哪一個?Android UI 組件發展史與演進對照表

在 Android 開發中,UI 組件一直在不斷演進,從最初的原生組件,到 Support Library(AppCompat 兼容庫),再到如今的 Material Design 組件。這篇文章將梳理 Android UI 組件的發展歷史,并提供詳細的…

python學習筆記--實現簡單的爬蟲(一)

任務:爬取豆瓣最受歡迎的250個電影的資料 鏈接:豆瓣電影 Top 250 用瀏覽器打開后,使用F12或鼠標右鍵--檢查,查看網頁的源代碼,分析網頁結構,如下圖所示: 分析后得知: 1.電影名位于…

Postgresql 刪除數據庫報錯

1、刪除數據庫時,報錯存在其他會話連接 ## 錯誤現象,存在其他的會話連接正在使用數據庫 ERROR: database "cs" is being accessed by other users DETAIL: There is 1 other session using the database.2、解決方法 ## 終止被刪除數據庫下…