go語言之OOP特性和演示

一、OOP特性

Go語言中的OOP特性

  • 結構體:在Go中,結構體用于定義復合類型,類似于其他語言中的類。它可以包含字段(屬性)和方法(行為)。
  • 方法:Go允許為任何自定義類型(包括結構體)定義方法,這與傳統OOP語言中類的方法類似。
  • 接口:接口是方法的集合,實現了這些方法的類型即實現了該接口。Go的接口提供了一種靈活的方式來進行多態操作
  • 組合而非繼承:Go提倡使用組合而非繼承來重用代碼。你可以將一個結構體嵌入到另一個結構體中,以達到類似繼承的效果

二、普通版本OOP

package mainimport "fmt"//定義文件操作者接口
type FileOperator interface {read()write()
}//定義文件結構體
type File struct {path  stringsize  intlabel string
}//定義XMLFile結構體,繼承File結構體
type XMLFile struct {Fileowner string
}// 定義File結構體的方法read
func (file File) read() {fmt.Println(file.label, "讀取文件")
}// 定義File結構體的方法write
func (file File) write() {fmt.Println(file.label, "寫入文件")
}// 定義函數useInterface,函數與方法的區別:函數不需要接收者,
// 方法需要接收者,上面read和write方法的接收者是File結構體的實例
// 該函數參數為實現了FileOperator接口的實例
func useInterface(fileOperator FileOperator) {fileOperator.read()fileOperator.write()
}// 重寫父結構體write方法
func (xml XMLFile) write() {fmt.Println(xml.label, "重寫父結構體write方法,寫入文件")
}func main() {// 實例化File結構體commonlFile := File{path:  "/root",size:  3000,label: "普通文件",}// 調用接口函數,commonlFile實現了接口的所有方法,所以能夠作為參數傳入useInterface(commonlFile)// 實例化xmlFile結構體,并實例化父結構體,File也可以直接用上面的父實例commonlFile,如下:// xmlFile := XML{// 	owner: "root",// 	File: commonlFile// }xmlFile := XMLFile{owner: "root",File: File{path:  "/home",size:  1000,label: "xml文件",},}// 調用接口函數,傳入子結構體實例,子結構體重寫了write方法useInterface(xmlFile)
}

輸出?

普通文件 讀取文件
普通文件 寫入文件
xml文件 讀取文件
xml文件 重寫父結構體write方法,寫入文件

?

三、帶指針的OOP

指針的好處:


1. 性能優化
減少內存拷貝:當你將一個大結構體或數組傳遞給函數時,如果不使用指針而是直接傳遞值,則會創建該數據的一個副本。對于大型數據結構,這可能導致顯著的性能開銷。通過使用指針,你可以避免這種不必要的復制,從而提高性能。


2. 修改原值的能力
改變調用者的數據:當函數參數是指針時,函數內部對參數所做的任何更改都會反映在調用者的數據上。這是因為函數接收的是實際數據的地址而不是其副本。這對于需要返回多個結果或者需要修改外部狀態的函數非常有用。


3. 高效的結構體操作
在處理結構體時,如果結構體較大,使用指針可以避免大量的內存復制。此外,在并發編程中,通過指針共享數據結構是常見做法,盡管需要注意同步問題以避免競態條件。


4. 動態分配內存
使用new()或make()等內置函數動態分配內存,并通過指針訪問這塊內存,可以使你的程序更加靈活。例如,當你不知道程序運行時需要多少元素的切片或映射時,可以通過指針來管理動態增長的數據結構。

?

?

package mainimport "fmt"//定義文件操作者接口
type FileOperator interface {read()write()
}//定義文件結構體
type File struct {path  stringsize  intlabel string
}//定義XMLFile結構體,繼承File結構體
type XMLFile struct {*Fileowner string
}// 定義File結構體的方法read
func (file *File) read() {fmt.Println(file.label, file.path, "讀取文件")
}// 定義File結構體的方法write
func (file *File) write() {fmt.Println(file.label, file.path, "寫入文件")
}// 定義修改文件路徑方法
func (file *File) modifyPath(newPath string) {file.path = newPath
}// 定義函數useInterface,函數與方法的區別:函數不需要接收者,
// 方法需要接收者,上面read和write方法的接收者是File結構體的實例
// 該函數參數為實現了FileOperator接口的實例
func useInterface(fileOperator FileOperator) {fileOperator.read()fileOperator.write()
}// 重寫父結構體write方法
func (xml *XMLFile) write() {fmt.Println(xml.label, "重寫父結構體write方法,寫入文件")
}func main() {// 實例化File結構體commonlFile := File{path:  "/root",size:  3000,label: "普通文件",}// 調用接口函數,commonlFile實現了接口的所有方法,所以能夠作為參數傳入useInterface(&commonlFile)// 實例化xmlFile結構體,并實例化父結構體,File也可以直接用上面的父實例commonlFile,如下:// xmlFile := XML{// 	owner: "root",// 	File: &commonlFile// }xmlFile := &XMLFile{owner: "root",File: &File{path:  "/home",size:  1000,label: "xml文件",},}xmlFile.modifyPath("/root/xml")// 調用接口函數,傳入子結構體實例,子結構體重寫了write方法useInterface(xmlFile)
}

輸出

普通文件 /root 讀取文件
普通文件 /root 寫入文件
xml文件 /root/xml 讀取文件
xml文件 重寫父結構體write方法,寫入文件

?

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

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

相關文章

USB3020任意波形發生器4路16位同步模擬量輸出卡1MS/s頻率 阿爾泰科技

信息社會的發展,在很大程度上取決于信息與信號處理技術的先進性。數字信號處理技術的出現改變了信息 與信號處理技術的整個面貌,而數據采集作為數字信號處理的必不可少的前期工作在整個數字系統中起到關鍵 性、乃至決定性的作用,其應用已經深…

ChatGPT大模型極簡應用開發-目錄

引言 要理解 ChatGPT,了解其背后的 Transformer 架構和 GPT 技術一路的演進則變得非常必要。 ChatGPT 背后的 LLM 技術使普通人能夠通過自然語言完成過去只能由程序員通過編程語言實現的任務,這是一場巨大的變革。然而,人類通常容易高估技術…

C++入門基礎篇:域、C++的輸入輸出、缺省參數、函數重載、引用、inline、nullptr

本篇文章是對C學習前期的一些基礎部分的學習分享,希望也能夠對你有所幫助。 那咱們廢話不多說,直接開始吧! 目錄 1.第一個C程序 2. 域 3. namespace 3.1 namespace的作用 3.2 namespace的定義 3.3 namespace使用說明 4.C的輸入和輸出…

RabbitMQ---TTL與死信

(一)TTL 1.TTL概念 TTL又叫過期時間 RabbitMQ可以對隊列和消息設置TTL,當消息到達過期時間還沒有被消費時就會自動刪除 注:這里我們說的對隊列設置TTL,是對隊列上的消息設置TTL并不是對隊列本身,不是說隊列過期時間…

先進制造aps專題二十七 西門子opcenter aps架構分析

歐美的商業aps,主要就是sap apo,西門子opcenter aps,達索quintiq 從技術的層面,西門子aps是不如sap apo的,但是西門子aps是西門子數字化工廠產品的核心,有很多特色,所以分析 西門子aps主要分計劃器和排產器兩個部分 計…

WPF如何跨線程更新界面

WPF如何跨線程更新界面 在WPF中,類似于WinForms,UI控件只能在UI線程(即主線程)上進行更新。WPF通過Dispatcher機制提供了跨線程更新UI的方式。由于WPF的界面基于Dispatcher線程模型,當你在非UI線程(例如后…

ingress-nginx代理tcp使其能外部訪問mysql

一、helm部署mysql主從復制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解壓后編輯values.yaml文件,修改如下(storageclass已設置默認類) 117 ## param architecture MySQL archit…

macOS Sequoia 15.3 beta3(24D5055b)發布,附黑、白蘋果鏡像下載地址

“ 鏡像(黑蘋果引導鏡像、白蘋果Mac鏡像、黑蘋果虛擬機鏡像)下載地址:黑果魏叔官網。” 關于macOS Sequoia 15.3 beta3(24D5055b),以下是對其的詳細介紹: 一、版本發布信息 發布時間 &#xf…

豪越科技消防一體化安全管控平臺:推動消防作訓模式智慧轉型

在當今數字化浪潮席卷全球的時代背景下,各行業都在積極尋求創新與變革,以提升工作效率、優化管理流程。消防行業作為保障社會安全的關鍵領域,其數字化轉型的需求尤為迫切。豪越科技的消防一體化安全管控平臺應運而生,為消防工作帶…

Tomcat下載配置

目錄 Win下載安裝 Mac下載安裝配置 Win 下載 直接從官網下載https://tomcat.apache.org/download-10.cgi 在圈住的位置點擊下載自己想要的版本 根據自己電腦下載64位或32位zip版本 安裝 Tomcat是綠色版,直接解壓到自己想放的位置即可 Mac 下載 官網 https://tomcat.ap…

1161 Merging Linked Lists (25)

Given two singly linked lists L1?a1?→a2?→?→an?1?→an? and L2?b1?→b2?→?→bm?1?→bm?. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1?→a2?→bm?→a3?→a4?→bm?1??. For ex…

【記錄】騰訊混元大模型本地部署過程

概述 本文記錄在本地部署騰訊混元大模型的過程。僅為部署記錄,不涉及過多的技術要點。 混元大模型主頁:https://github.com/Tencent/HunyuanVideo 該模型應該是當前開源的效果不錯的模型,其實官方文檔將部署過程寫的相當詳細了,但是這里為了便于后期的學習,特意將部署過程…

Go-知識 版本演進

Go-知識 版本演進 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具語言包工具小修訂 r58(2011/06/29)語言包工具小修訂 r59(2011/08/01)語言包工具 r60(2011/09/07)語言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

Java鎖 死鎖及排查 JVM 工具 jconsole 工具 排查死鎖

目錄 概述 死鎖案例 (面試) 如何排查死鎖 使用 JVM 工具排查死鎖 使用 jconsole 工具排查死鎖 細節 概述 死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力于涉那它們都將無法推進下去,如果系統資源充足,…

計算機網絡 (49)網絡安全問題概述

前言 計算機網絡安全問題是一個復雜且多維的領域,它涉及到網絡系統的硬件、軟件以及數據的安全保護,確保這些元素不因偶然的或惡意的原因而遭到破壞、更改或泄露。 一、計算機網絡安全的定義 計算機網絡安全是指利用網絡管理控制和技術措施,保…

CSS 合法顏色值

CSS 顏色 CSS 中的顏色可以通過以下方法指定: 十六進制顏色帶透明度的十六進制顏色RGB 顏色RGBA 顏色HSL 顏色HSLA 顏色預定義/跨瀏覽器的顏色名稱使用 currentcolor 關鍵字 十六進制顏色 用 #RRGGBB 規定十六進制顏色,其中 RR(紅色&…

C# 實現系統信息監控與獲取全解析

在 C# 開發的眾多應用場景中,獲取系統信息以及監控用戶操作有著廣泛的用途。比如在系統性能優化工具中,需要實時讀取 CPU、GPU 資源信息;在一些特殊的輸入記錄程序里,可能會涉及到鍵盤監控;而在圖形界面開發中&#xf…

使用docker-compose安裝ELK(elasticsearch,logstash,kibana)并簡單使用

首先服務器上需要安裝docker已經docker-compose,如果沒有,可以參考我之前寫的文章進行安裝。 https://blog.csdn.net/a_lllk/article/details/143382884?spm1001.2014.3001.5502 1.下載并啟動elk容器 先創建一個網關,讓所有的容器共用此網…

二十四、NetworkPolicy

NetworkPolicy 一、基礎網路 Kubernetes網絡模型設計的一個基礎原則是:每個Pod都擁有一個獨立的IP地址,并假定所有Pod都在一個可以直接連通的、扁平的網絡空間中。所以不管它們是否運行在同一個Node(宿主機)中,都要求它們可以直接通過對方的IP進行訪問。設計這個原則的原…

Python Web應用開發入門:從零搭建一個簡單的Web應用

引言 在當今的互聯網時代,Web應用已經成為我們日常生活中不可或缺的一部分。無論是社交媒體、電子商務,還是在線教育,Web應用都在背后發揮著重要作用。Python作為一種簡潔、強大的編程語言,在Web開發領域也有著廣泛的應用。本文將帶你從零開始,使用Python搭建一個簡單的W…