Hi,大家好,我是明哥,
在自己學習 Golang 的這段時間里,我寫了詳細的學習筆記放在我的個人微信公眾號 《Go編程時光》,對于 Go 語言,我也算是個初學者,因此寫的東西應該會比較適合剛接觸的同學,如果你也是剛學習 Go 語言,不防關注一下,一起學習,一起成長,
我的在線博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime
0. 介面是什么?
這一段摘自 Go語言中文網
在面向物件的領域里,介面一般這樣定義:介面定義一個物件的行為,介面只指定了物件應該做什么,至于如何實作這個行為(即實作細節),則由物件本身去確定,
在 Go 語言中,介面就是方法簽名(Method Signature)的集合,當一個型別定義了介面中的所有方法,我們稱它實作了該介面,這與面向物件編程(OOP)的說法很類似,介面指定了一個型別應該具有的方法,并由該型別決定如何實作這些方法,
1. 如何定義介面
使用 type 關鍵字來定義介面,
如下代碼,定義了一個電話介面,介面要求必須實作 call 方法,
type Phone interface {
call()
}
2. 如何實作介面
如果有一個型別/結構體,實作了一個介面要求的所有方法,這里 Phone 介面只有 call方法,所以只要實作了 call 方法,我們就可以稱它實作了 Phone 介面,
意思是如果有一臺機器,可以給別人打電話,那么我們就可以把它叫做電話,
這個介面的實作是隱式的,不像 JAVA 中要用 implements 顯示說明,
繼續上面電話的例子,我們先定義一個 Nokia 的結構體,而它實作了 call 的方法,所以它也是一臺電話,
type Nokia struct {
name string
}
// 接收者為 Nokia
func (phone Nokia) call() {
fmt.Println("我是 Nokia,是一臺電話")
}
3. 介面實作多型
鴨子型別(Duck typing)的定義是,只要你長得像鴨子,叫起來也像鴨子,那我認為你就是一只鴨子,
舉個通俗的例子
什么樣子的人可以稱做老師呢?
不同的人標準不一,有的人認為必須有一定的學歷,有的人認為必須要有老師資格證,
而我認為只要能育人,能給傳授給其他人知識的,都可以稱之為老師,
而不管你教的什么學科?是體育競技,還是教人烹飪,
也不管你怎么教?是在教室里手執教教鞭、拿著粉筆,還是追求真實,直接實戰演練,
通通不管,
這就一個介面(老師)下,在不同物件(人)上的不同表現,這就是多型,
在 Go 語言中,是通過介面來實作的多型,
這里以商品介面來寫一段代碼演示一下,
先定義一個商品(Good)的介面,意思是一個型別或者結構體,只要實作了settleAccount() 和 orderInfo() 兩個方法,那這個型別/結構體就是一個商品,
type Good interface {
settleAccount() int
orderInfo() string
}
然后我們定義兩個結構體,分別是手機和贈品,
type Phone struct {
name string
quantity int
price int
}
type FreeGift struct {
name string
quantity int
price int
}
然后分別為他們實作 Good 介面的兩個方法
// Phone
func (phone Phone) settleAccount() int {
return phone.quantity * phone.price
}
func (phone Phone) orderInfo() string{
return "您要購買" + strconv.Itoa(phone.quantity)+ "個" +
phone.name + "計:" + strconv.Itoa(phone.settleAccount()) + "元"
}
// FreeGift
func (gift FreeGift) settleAccount() int {
return 0
}
func (gift FreeGift) orderInfo() string{
return "您要購買" + strconv.Itoa(gift.quantity)+ "個" +
gift.name + "計:" + strconv.Itoa(gift.settleAccount()) + "元"
}
實作了 Good 介面要求的兩個方法后,手機和贈品在Go語言看來就都是商品(Good)型別了,
這里候,我挑選了兩件商品(實體化),分別是手機和耳機(贈品,不要錢)
iPhone := Phone{
name: "iPhone",
quantity: 1,
price: 8000,
}
earphones := FreeGift{
name: "耳機",
quantity: 1,
price: 200,
}
然后創建一個購物車(也就是型別為 Good的切片),來存放這些商品,
goods := []Good{iPhone, earphones}
最后,定義一個方法來計算購物車里的訂單金額
func calculateAllPrice(goods []Good) int {
var allPrice int
for _,good := range goods{
fmt.Println(good.orderInfo())
allPrice += good.settleAccount()
}
return allPrice
}
完整代碼,我貼在下面,供你參考,
package main
import (
"fmt"
"strconv"
)
// 定義一個介面
type Good interface {
settleAccount() int
orderInfo() string
}
type Phone struct {
name string
quantity int
price int
}
func (phone Phone) settleAccount() int {
return phone.quantity * phone.price
}
func (phone Phone) orderInfo() string{
return "您要購買" + strconv.Itoa(phone.quantity)+ "個" +
phone.name + "計:" + strconv.Itoa(phone.settleAccount()) + "元"
}
type FreeGift struct {
name string
quantity int
price int
}
func (gift FreeGift) settleAccount() int {
return 0
}
func (gift FreeGift) orderInfo() string{
return "您要購買" + strconv.Itoa(gift.quantity)+ "個" +
gift.name + "計:" + strconv.Itoa(gift.settleAccount()) + "元"
}
func calculateAllPrice(goods []Good) int {
var allPrice int
for _,good := range goods{
fmt.Println(good.orderInfo())
allPrice += good.settleAccount()
}
return allPrice
}
func main() {
iPhone := Phone{
name: "iPhone",
quantity: 1,
price: 8000,
}
earphones := FreeGift{
name: "耳機",
quantity: 1,
price: 200,
}
goods := []Good{iPhone, earphones}
allPrice := calculateAllPrice(goods)
fmt.Printf("該訂單總共需要支付 %d 元", allPrice)
}
運行后,輸出如下
您要購買1個iPhone計:8000元
您要購買1個耳機計:0元
該訂單總共需要支付 8000 元
系列導讀
01. 開發環境的搭建(Goland & VS Code)
02. 學習五種變數創建的方法
03. 詳解資料型別:****整形與浮點型
04. 詳解資料型別:byte、rune與string
05. 詳解資料型別:陣列與切片
06. 詳解資料型別:字典與布爾型別
07. 詳解資料型別:指標
08. 面向物件編程:結構體與繼承
09. 一篇文章理解 Go 里的函式
10. Go語言流程控制:if-else 條件陳述句
11. Go語言流程控制:switch-case 選擇陳述句
12. Go語言流程控制:for 回圈陳述句
13. Go語言流程控制:goto 無條件跳轉
14. Go語言流程控制:defer 延遲呼叫
15. 面向物件編程:介面與多型
16. 關鍵字:make 和 new 的區別?
17. 一篇文章理解 Go 里的陳述句塊與作用域
18. 學習 Go 協程:goroutine
19. 學習 Go 協程:詳解信道/通道
20. 幾個信道死鎖經典錯誤案例詳解
21. 學習 Go 協程:WaitGroup
22. 學習 Go 協程:互斥鎖和讀寫鎖
23. Go 里的例外處理:panic 和 recover
24. 超詳細解讀 Go Modules 前世今生及入門使用
25. Go 語言中關于包匯入必學的 8 個知識點
26. 如何開源自己寫的模塊給別人用?
27. 說說 Go 語言中的型別斷言?
28. 這五點帶你理解Go語言的select用法

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145101.html
標籤:Python
下一篇:scrapy 自定義命令
