golang中的類和接口

在 Go 語言中并沒有類的概念,而是使用結構體來實現面向對象的特性。通過 type 關鍵字可以定義自定義類型,包括結構體類型。下面是一個簡單的示例:

package mainimport "fmt"// 定義一個結構體類型
type Person struct {Name stringAge  int
}// 定義結構體方法,類似于類的成員方法
func (p Person) SayHello() {fmt.Printf("Hello, my name is %s and I'm %d years old.\n", p.Name, p.Age)
}func main() {// 創建一個結構體對象person := Person{Name: "Alice", Age: 30}// 調用結構體方法person.SayHello()
}

在這個示例中,我們使用 type 關鍵字定義了一個名為 Person 的結構體類型,它包含了 NameAge 兩個字段。然后,我們定義了一個結構體方法 SayHello(),它用于輸出該結構體對象的信息。在 main() 函數中,我們創建了一個 Person 類型的對象,并調用了 SayHello() 方法。

盡管 Go 中沒有類的概念,但結構體類型可以包含字段和方法,從而實現面向對象編程的特性。結構體的方法可以在函數名前加上接收者參數,通過這種方式,結構體類型可以擁有類似于類的方法。

面向過程到面向對象

pulsar 生產者

下面是一個結構化的生產者方法

// 生產者
func Producer(ip string, port int8, topic string)  {client, err := pulsar.NewClient(pulsar.ClientOptions{URL: "pulsar://192.168.1.10:6650",})defer client.Close()producer, err := client.CreateProducer(pulsar.ProducerOptions{Topic: "demo123567",})for{_, err = producer.Send(context.Background(), &pulsar.ProducerMessage{Payload: []byte("hello"),})defer producer.Close()if err != nil {fmt.Println("Failed to publish message", err)} else {fmt.Println("Published message")}time.Sleep(1 * time.Second)}
}

改造成面向對象的結構體方法為:

package pulsartoolsimport ("context""fmt""github.com/apache/pulsar-client-go/pulsar"
)// Producer 結構體定義
type Producer struct {client   pulsar.Clientproducer pulsar.Producer
}// NewProducer 初始化生產者對象
func NewProducer(ip string, port int, topic string) (*Producer, error) {client, err := pulsar.NewClient(pulsar.ClientOptions{URL: fmt.Sprintf("pulsar://%s:%d", ip, port),})if err != nil {return nil, err}producer, err := client.CreateProducer(pulsar.ProducerOptions{Topic: topic,})if err != nil {return nil, err}return &Producer{client:   client,producer: producer,}, nil
}// Send 發送消息
func (p *Producer) Send(msg string) error {_, err := p.producer.Send(context.Background(), &pulsar.ProducerMessage{Payload: []byte(msg),})if err != nil {fmt.Println("Failed to publish message", err)} else {fmt.Println("Published message")}return err
}// Close 關閉生產者
func (p *Producer) Close() {p.producer.Close()p.client.Close()
}

這段代碼將原來的生產者函數改造為了一個名為 Producer 的結構體類型,并定義了三個方法:NewProducerSendClose

  • NewProducer 方法用于初始化生產者對象。它接收 IP 地址、端口和主題作為參數,創建一個 Pulsar 客戶端,并使用客戶端創建一個生產者對象。如果初始化過程中出現錯誤,則返回 nil 和錯誤信息。

  • Send 方法用于發送消息。它接收一個消息字符串作為參數,并通過生產者對象發送消息到指定的主題。如果發送過程中出現錯誤,則輸出錯誤信息;否則輸出消息發送成功的提示。

  • Close 方法用于關閉生產者對象。它先關閉生產者,然后關閉 Pulsar 客戶端。

這樣改造后,生產者的功能被封裝在了一個結構體類型中,使得代碼更加模塊化和可維護。通過調用結構體的方法來使用生產者對象,使得代碼更加直觀和易于理解。

接口

在 Go 語言中,接口是一種抽象類型,它定義了對象的行為。接口類型是由一組方法定義的集合,一個對象只要實現了接口中定義的所有方法,就被認為是實現了該接口。

接口的定義使用 type 關鍵字,接口中的方法沒有實現,只有方法簽名,類似于其他語言中的抽象方法。任何類型只要擁有接口中定義的全部方法,即使未顯式聲明實現了該接口,也被視為實現了該接口。

接口的聲明格式為

type InterfaceName interface {Method1() ReturnType1Method2(arg Type) ReturnType2// 更多方法...
}

其中 InterfaceName 是接口的名稱,Method1Method2 等是接口的方法,ReturnType1ReturnType2 是方法的返回類型,Type 是方法參數的類型。
下面是一個簡單的接口示例

package main
import "fmt"
// 定義一個接口
type Animal interface {Speak() string
}
// 定義一個結構體類型
type Dog struct{}
// Dog 結構體類型實現了 Animal 接口的 Speak 方法
func (d Dog) Speak() string {return "Woof!"
}
// main 函數
func main() {// 創建一個 Dog 對象dog := Dog{}// 將 Dog 對象賦值給 Animal 接口var animal Animal = dog// 調用接口方法fmt.Println(animal.Speak()) // Output
Woof!
}

在這個示例中,我們定義了一個 Animal 接口,它包含一個 Speak 方法。然后我們定義了一個 Dog 結構體類型,并為它實現了 Speak 方法。在 main 函數中,我們創建了一個 Dog 對象,并將其賦值給 Animal 接口。通過接口,我們可以調用 Speak 方法來執行相應的行為。

接口的使用使得代碼更加靈活和可擴展,可以讓不同的類型通過實現相同的接口來實現多態。

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

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

相關文章

只對外公開必要的信息和步驟

隱藏內部結構 使對象的內部結構對外部不可見的內容的處理被稱為封裝化。只公開方法等使用者所需要的最低限度的接口,使用者只能通過外部接口進行訪問。如此一來,使用該類的程序就無須知道其內部的具體實現。 通過封裝化,不僅可以防止調用者…

Node.js安裝及環境配置(超詳細!保姆級!!)

目錄 一、進入官網地址下載安裝包 二、安裝程序 三、環境配置 四、測試 五、安裝淘寶鏡像 一、進入官網地址下載安裝包 Node.js — Download Node.js (nodejs.org) 選擇對應你系統的 node.js 版本,我選擇的是Windows系統,64位 點擊圖中選項&#…

無人機+應急通信:災害現場應急通信車技術詳解

無人機和應急通信車是災害現場應急通信中的重要技術。無人機可以通過快速到達災害現場,搭載高清攝像頭、紅外熱成像儀、激光雷達等設備,對災區進行實時監測和災情評估,同時也可以通過搭載的通信設備,與指揮中心進行實時通信和數據…

APP逆向實現方式總覽

方式一:硬核分析 梳理出參數的構造邏輯,代碼還原算法 方式二:模擬執行 2.1 Frida-RPC 電腦調用已加載到手機內存中的方法,直接獲取到結果 2.2 AndServer-RPC 安卓程序調用手機中的方法,最后暴露成HTTP服務供電腦…

?什么是排他鎖、共享鎖、意向鎖

共享鎖 共享鎖,又被稱為讀鎖,是由讀取操作所創建的一種鎖。在此期間,其他用戶可以同時讀取數據,但在數據上未釋放所有共享鎖之前,任何事務均無法對其進行修改(即獲取數據的排他鎖)。 一旦事務…

202009青少年軟件編程(Python)等級考試試卷(三級)

第 1 題 【單選題】 通過算式123122021120可將二進制1101 轉為十進制,下列進制轉換結果正確的是?( ) A :0b10轉為十進制,結果是2 B :0d10轉為十進制,結果是8 C :0x10轉為十進制,結果是10 D :0o10轉為十進制,結果是16 正確答案:A 試題解析: 第 2 題 【單選題】 語句flo…

基于Nios-II實現流水燈

文章目錄 一、新建項目1、選擇芯片2、Qsys設計2.1、點擊Platform Designer2.2配置軟核2.3其他設置 3、Quartus設計3.1添加原理圖3.2添加qip文件3.3其他設置3.4驅動設置 4、Nios-II Eslipse設計參考 一、新建項目 使用的Quartus 18.0及以上版本 1、選擇芯片 2、Qsys設計 2.1、點…

【AIGC調研系列】你好-GPT-4o

GPT-4o是OpenAI最新發布的一款人工智能模型,它具備處理和生成文本、音頻和圖像的能力。這個模型的特點是能夠實時對這些不同類型的輸入進行推理和響應,這使得它在多模態交互方面表現出色[1][2][3]。 GPT-4o的“o”代表“omni”,意味著它是一…

【復試分數線】綜合性985歷年分數線匯總(第四彈)

國家線和34所自劃線 可以看作是考研上岸最最最基礎的門檻。真正決定你能不能進入復試的還要看院線(復試分數線)!今天我將分析考信號的除C9、工科類985的其他7所985近三年復試分數線(不包括2024),大家可以參…

Azure IoT Hub是啥

1.概要說明 Azure IoT Hub是微軟在物聯網(IoT)領域提供的一款重要產品,為設備連接和管理提供了專業的解決方案。以下是關于Azure IoT Hub的詳細介紹: 定義:Azure IoT Hub是一個專為連接和管理數百萬臺物聯網設備而設計…

flutter開發實戰-人臉識別相機使用

flutter開發實戰-人臉識別相機使用 當需要拍攝的時候,需要檢測到人臉再進行后續的操作,這里使用的是face_camera 一、引入face_camera 在工程的pubspec.yaml中引入插件 # 檢測人臉face_camera: ^0.0.8iOS端需要設置相關權限 在info.plist文件中&…

如何按住ctrl滑動鼠標桌面圖標大小不變

如何按住ctrl滑動鼠標桌面圖標大小不變 采取以下步驟: 1、鼠標在電腦桌面空白處單擊右鍵,然后在彈出的對話框最上面有個“查看”,點擊“查看”出來的最上面有“大圖標”“中等圖標”“小圖標”,根據自己的需要選擇圖標大小即可。…

網絡安全快速入門(九)MySQL進階操作

上一章我們了解了對表及庫的基本增刪查改操作,本章我們針對增刪查改內容進行與一些拓展, 9.1字段修飾及數據類型 我們之前在創建表時用到的格式為: create table 表名 ( 字段名1 字段數據類型(數據類型長度), 字段名2 …

Pytorch學習-調整torchvision.models中模型輸出類別數

假設你的類別只有10個,而torchvision.models中Vgg16的輸出類別為1000,這時應該如何調整呢? 方法一,直接修改模型中類別的輸出。 from torch.nn import Linear import torchvision import torchVgg16torchvision.models.vgg16(pre…

華為認證大數據是什么?華為認證大數據有用嗎?

華為大數據是用來搜集整理大數據,提供解決方案的數據中心。華為大數據解決方案是華為公司推出的一種綜合性云解決方案,主要針對廣告營銷、電商、車聯網等大數據應用場景的云計算大數據方案,幫助企業用戶構建大數據平臺,解決企業的…

GRE over IPsec VPN實驗

一、拓撲圖 二、組網需求 某企業總部、分支1、分支2分別通過 R1,R3,R4 接入互聯網,配置默認路由連通公網按照圖示配置 IP 地址,R1,R3,R4 分別配置 Loopback0 口匹配感興趣流,Loopback1 口模擬業…

GPIO輸出速度(ARM-GD32)

單片機輸出速度對GPIO硬件的影響 如果T為100ns 那么2/3*100ns 67ns 那么tr tf 38 ns (也就是不能超過32ns) tr 和tf和什么東西有關如何去控制 CL 是一個電容,電容會改變和影響電壓變化的速率,輸出高低電平也就是對電容進行充電…

【噪聲學習】SELFIE:更新不干凈樣本的魯棒性深度學習

SELFIE: Refurbishing Unclean Samples for Robust Deep Learning 摘要: 由于深度神經網絡具有極高的表達能力,其副作用是即使在標簽噪聲極高的情況下也能完全記住訓練數據。為了克服對噪聲標簽的過度擬合,我們提出了一種名為 SELFIE 的新型魯棒訓練方法。我們的主要想法是…

俄羅斯方塊【python,小游戲】

俄羅斯方塊(Tetris)是一款經典的俄羅斯益智游戲,游戲的核心玩法是通過移動、旋轉和放置不同形狀的方塊,使它們在游戲界面的底部形成完整的水平線。一旦水平線填滿,就會被清除,為新的方塊騰出空間。 在 Pyt…

Python GUI開發- PyQt5 開發小工具環境入門

前言 常見的python開發gui的庫有 Tkinter, PyQt5, wxPython等。本教程是選擇PyQt5 開發桌面小工具。 環境準備 只需pip安裝即可快速準備好開發環境 pip install pyqt5快速開始 創建一個空的window窗口 Qapplication():每個GUI都必須包含…