5.Go-封裝、繼承、介面、多態和斷言

来源:https://www.cnblogs.com/derek1184405959/archive/2019/08/06/11306426.html
-Advertisement-
Play Games

面向對象 Go語言開發者認為:面向對象就是特定類型(結構體)有著自己的方法,利用這個方法完成面向對象編程, 並沒有提封裝、繼承、多態。所以Go語言進行面向對象編程時,重點在於靈活使用方法。 Go語言有著自己對面向對象的理解,它也有著自己的封裝、繼承、多態。 5.1.封裝 實例 5.2.繼承 5.3. ...


面向對象

Go語言開發者認為:面向對象就是特定類型(結構體)有著自己的方法,利用這個方法完成面向對象編程,

並沒有提封裝、繼承、多態。所以Go語言進行面向對象編程時,重點在於靈活使用方法。

Go語言有著自己對面向對象的理解,它也有著自己的封裝、繼承、多態。

5.1.封裝

實例

//Learn_Go/main.go
package main

import (
	"fmt"
)

type People struct {
	name string
	age int
}

func (p *People) SetName(name string)  {
	p.name = name
}

func (p *People) SetAge(age int)  {
	p.age = age
}

func (p *People) GetName() string{
	return p.name
}

func (p *People) GetAge() int{
	return p.age
}

func main()  {
	peo := new(People)
	peo.SetName("derek")
	peo.SetAge(22)
	fmt.Println(peo.GetName(),peo.GetAge())     //derek 22
}

5.2.繼承

//Learn_Go/main.go
package main

import "fmt"

type People struct {
	name string
	age int
}

type Teacher struct {
	People
	classroom string
}

func main()  {
	tea := Teacher{People{"derek",22},"911"}
	fmt.Println(tea.classroom,tea.name,tea.age)    //911 derek 22
}

5.3.介面

介面是一組行為規範的定義

介面中只能有方法聲明,方法只能有名次、參數、返回值,不能有方法體

每個介面中可以有多個方法,結構體把介面總所有方法都重寫後,結構體就屬於介面類型

Go語言中介面和結構體之間的關係是傳統面向對象中is-like-a的關係

//Learn_Go/main.go
package main

import "fmt"

type Live interface {
	run(i int)
	eat(thing string)
}

type People struct {
	name string
}

func (p *People) run(i int)  {
	fmt.Println(p.name,"跑了",i,"米")
}

func (p *People) eat(thing string)  {
	fmt.Println(p.name,"正在吃",thing)
}

func main()  {
	peo := People{"derek"}
	peo.run(100)
	peo.eat("麵包")
}

5.4.多態  

多態:同一件事情由於條件不同產生的結果不同

由於go語言中結構體不能相互轉換,所以沒有結構體的多態,只有基於介面的多態

//Learn_Go/main.go
package main

import "fmt"

type Live interface {
	run()
}

type People struct {
	name string
}

type Animal struct {
	name string
}

func (p *People) run()  {
	fmt.Printf("%v在跑步",p.name)
}

func (a *Animal) run()  {
	fmt.Printf("%v在跑步",a.name)
}

func allrun(live Live)  {
	live.run()
}

func main()  {
	//介面不能實例化,只能對介面的結構體實例化
	peo := &People{"derek"}
	allrun(peo)      //derek在跑步
	//多態,條件不同結果不同
	a := &Animal{"小狗"}
	allrun(a)       //小狗在跑步
}

5.5.斷言

只要實現了介面的全部方法認為這個類型屬於介面類型,如果編寫一個介面,這個介面沒有任何

方法,這是認為所有類型都是了這個介面,所以Go語言中interface{}代表任意類型

如果interface{]作為方法參數就可以接受任意類型,但是在程式中有時有需要知道這個參數

到底是什麼類型,這個時候就需要使用斷言

(1)斷言可以有一個返回值,如果判斷結果是指定類型返回變數值,否則報錯

//Learn_Go/main.go
package main

import "fmt"

func main()  {
	var i interface{} = 44     //i是int類型
	result1 := i.(int)
	fmt.Println(result1)     //44

	result2 := i.(string)
	fmt.Println(result2)    //panic: interface conversion: interface {} is int, not string
}

(2)可以查看值的類型 

//Learn_Go/main.go
package main

import "fmt"

func main()  {
	var i interface{} = 44     //i是int類型
	result,ok := i.(int)
	fmt.Println(result,ok)     //44 true
	fmt.Printf("%T",result)    //int
}   

(3)通過斷言判斷值的類型

//Learn_Go/main.go
package main

import "fmt"

func demo(i interface{})  {
	_,ok := i.(int)
	if ok{
		fmt.Println("參是int類型")
		return
	}
	_,ok = i.(string)
	if ok{
		fmt.Println("參是string類型")
		return
	}
	fmt.Println("參數類型不確定,不是int和string類型")
}

func main()  {
	demo(8)            //參是int類型
	demo("derek")      //參是string類型
	demo(3.146)        //參數類型不確定,不是int和string類型
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 函數概念: 函數是用來完成某種特定任務的可重用代碼塊; 函數可以使程式更具模塊化,擁有良好的結構; 函數定義後在程式中可以重覆調用; 函數分為內置函數和自定義函數 考點: 變數的作用域和靜態變數 延伸1,函數的參數及參數的引用傳遞。 延伸2,函數的返回值及引用返回。 延伸3,外部文件的導入。 延伸4 ...
  • [TOC] 原文鏈接: "Qt實現表格樹控制項 自繪樹節點虛線" 一、開心一刻 一程式員第一次上女朋友家她媽板著臉問 :你想娶我女兒,有多少存款? 程式員低了下頭:五百! 她媽更鄙視了:才五百塊,買個廁所都不夠! 程式員忙說:不是人民幣! 她媽:就算是美元,還是不夠買廁所! 程式員:其實是比特幣! 她 ...
  • 後端基於方法的許可權控制 Spirng Security 預設情況下, Spring Security 並不啟用方法級的安全管控. 啟用方法級的管控後, 可以針對不同的方法通過註解設置不同的訪問條件;Spring Security 支持三種方法級註解, 分別是 JSR 205/Secured 註解/p ...
  • 一、生活場景 基於建造者模式,描述軟體開發的流程。 1、代碼實現 2、代碼結構圖 二、建造者模式 1、基礎概念 建造模式是對象的創建模式。建造模式可以將一個產品的內部屬性描述與產品的生產過程分割,從而可以使一個建造過程生成具有不同的內部表象的產品對象。也就是使用一個中介對象封裝一系列的對象交互,使其 ...
  • 一. 數據類型轉換 1.1 自動類型轉換 又叫:隱式類型轉換 概念:數據範圍小的類型能自動轉換成數據範圍大的類型 byte short int long float double 1.2 強制類型轉換 概念:將數據範圍大的類型使用指定格式轉換成數據範圍小的類型 格式:範圍小的數據類型 變數名 = ( ...
  • Ural 1029 Ministry 題解 [TOC] 題意 給定一個$n\times m(1\le n \le10,1\le m \le500)$的矩陣,矩陣中的每個值都是一個小於等於$10^9$的正整數。 現在從第$1$行的任意位置開始,在第$n$行的任意位置結束。每次有$3$種移動選擇(不能移 ...
  • 上班有一周了,聊一聊在大廠上班的一點感受和學到的一些東西。 1.吃飯也有江湖 入職那天去了周圍的一家早餐點,看了一眼價格,不得不說帝都著外面的店真的貴啊,半根油條6塊錢,一碗豆漿5塊錢,一根烤腸5塊錢,隨隨便便一頓早飯就15 20塊了,瑟瑟發抖。。。平時午餐點個外賣的話算上餐盒費和送餐費,一個外賣大 ...
  • 目錄 [隱藏] 0.1 前言: 0.2 界面 0.3 Maven 環境 0.4 項目結構 0.5 整合 Hibernate 0.5.1 SQLiteDialect.java 資料庫方言代碼 0.5.2 hibernate.cfg.xml Hibernate配置文件 0.6 項目初始化連接資料庫自動建 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...