您好,登錄后才能下訂單哦!
本篇內容主要講解“go語言可不可以開發接口”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“go語言可不可以開發接口”吧!
go語言可以開發接口。go語言中接口是一組方法的簽名,它是go語言中重要的組成部分,接口做的事情就好像是定義一個規范或者協議,各個實現方只要按照協議實現即可。go語言中使用interface關鍵字來定義接口,語法“type 接口類型名 interface{方法名1( 參數列表1 ) 返回值列表1 方法名2( 參數列表2 ) 返回值列表2…}”。
接口對于我們來說應該是一個比較熟悉的概念,在各種開發語言中運用都非常的廣泛,對于像我們比較熟悉java的程序員來說對于接口就更加的親切,下面我們來看下在go語言中接口是怎么用,以及接口在日常開發中發揮的作用。
go語言中接口是一組方法的簽名,它是go語言中重要的組成部分,接口做的事情就好像是定義一個規范或者協議,各個實現方只要按照協議實現即可。
接口是一種類型
接口類型是對其他類型行為的抽象和概括,不關心具體的實現細節,這種抽象的方式可以讓我們的函數變的更加靈活。
type 接口類型名 interface{
方法名1( 參數列表1 ) 返回值列表1
方法名2( 參數列表2 ) 返回值列表2
…
}
在go語言中我們使用interface關鍵字來定義接口。
如果一個任意類型T的方法集為一個接口類型的方法集的超集,則我們說類型T實現了該接口。
接口的實現在go語言中是隱式的,也就說兩個類型之間的實現關系不需要在代碼中體現出來,G哦語言中也沒有類似java中implements的關鍵字,Go編譯器將自動在需要的時候檢查兩個類型之間的實現關系。接口定義后,需要實現接口,調用方才能正確編譯通過并使用接口。
接口的實現需要遵循兩條規則才能讓接口可用:
1、接口的方法與實現接口的類型方法格式一致在類型中添加與接口簽名一致的方法就可以實現該方法。簽名包括方法中的名稱、參數列表、返回參數列表。也就是說,只要實現接口類型中的方法的名稱、參數列表、返回參數列表中的任意一項與接口要實現的方法不一致,那么接口的這個方法就不會被實現。
package main
import "fmt"
type Phone interface {
Call()
SendMessage()
}
type HuaWei struct {
Name string
Price float64
}
func (h *HuaWei) Call() {
fmt.Printf("%s:可以打電話",h.Name)
}
func (h *HuaWei) SendMessage() {
fmt.Printf("%s:可以發送短信",h.Name)
}
func main() {
h := new(HuaWei)
h.Name="華為"
var phone Phone
phone = h
phone.SendMessage()
}
當類型無法實現接口時,編譯器會報錯:
a.函數名稱不一致導致的報錯
b.實現函數的方法簽名不一致導致的報錯
2、接口中所有方法均被實現當一個接口中有多個方法時,只有這些方法都被實現了,接口才能被正確編譯并使用
func (h *Xiaomi) Call() {
fmt.Printf("%s:可以打電話",h.Name)
}
func main() {
h := new(Xiaomi)
h.Name="小米"
var phone Phone
phone = h
phone.SendMessage()
}
當 小米 類型僅僅實現接口中的一個方法的時候,我們在使用的時候,編譯報錯。
一個類型實現多個接口
一個類型可以實現多個接口,而接口之間彼此獨立,不知道對方的實現。
例如,狗既可以動,可以叫
package main
import "fmt"
type Move interface {
move()
}
type Say interface {
say()
}
type Dog struct {
Name string
}
func (d *Dog) move() {
fmt.Printf("%s會動\n", d.Name)
}
func (d *Dog) say() {
fmt.Printf("%s會叫汪汪汪\n", d.Name)
}
func main() {
var m Move
var s Say
d:=&Dog{
Name: "旺財",
}
m = d
s=d
m.move()
s.say()
}
多個類型實現同一個接口
Go語言中不同的類型還可以實現同一接口 首先我們定義一個Mover接口,它要求必須有一個move方法。
type Mover interface {
move()
}
例如狗可以動,汽車也可以動,可以使用如下代碼實現這個關系:
type dog struct {
name string
}
type car struct {
brand string
}
// dog類型實現Mover接口
func (d dog) move() {
fmt.Printf("%s會跑\n", d.name)
}
// car類型實現Mover接口
func (c car) move() {
fmt.Printf("%s速度70邁\n", c.brand)
}
這個時候我們在代碼中就可以把狗和汽車當成一個會動的物體來處理了,不再需要關注它們具體是什么,只需要調用它們的move方法就可以了。
func main() {
var x Mover
var a = dog{name: "旺財"}
var b = car{brand: "保時捷"}
x = a
x.move()
x = b
x.move()
}
空接口:interface{},不包含任何方法,正因為如此,任何類型都實現了空接口,所以空接口可以存儲任意類型的數據。
fmt
包下的 Print
系列函數,其參數大多是空接口類型,也可以說支持任意類型
func Print(a ...interface{}) (n int, err error)
func Println(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
空接口作為map的值
// 空接口作為map值
var studentInfo = make(map[string]interface{})
studentInfo["name"] = "李白"
studentInfo["age"] = 18
studentInfo["married"] = false
fmt.Println(studentInfo)
空接口可以存儲任意類型的值,那我們如何獲取其存儲的具體數據呢?
接口值
一個接口的值(簡稱接口值)是由一個具體類型和具體類型的值兩部分組成的。
這兩部分分別稱為接口的動態類型和動態值。
想要判斷空接口中的值這個時候就可以使用類型斷言,其語法格式:
x.(T)
其中:
x:表示類型為interface{}的變量
T:表示斷言x可能是的類型。
該語法返回兩個參數,第一個參數是x轉化為T類型后的變量,第二個值是一個布爾值,若為true則表示斷言成功,為false則表示斷言失敗。
func main() {
var x interface{}
x = "ms的go教程"
v, ok := x.(string)
if ok {
fmt.Println(v)
} else {
fmt.Println("類型斷言失敗")
}
}
上面的示例中如果要斷言多次就需要寫多個if判斷,這個時候我們可以使用switch語句來實現:
func justifyType(x interface{}) {
switch v := x.(type) {
case string:
fmt.Printf("x is a string,value is %v\n", v)
case int:
fmt.Printf("x is a int is %v\n", v)
case bool:
fmt.Printf("x is a bool is %v\n", v)
default:
fmt.Println("unsupport type!")
}
}
因為空接口可以存儲任意類型值的特點,所以空接口在Go語言中的使用十分廣泛。
到此,相信大家對“go語言可不可以開發接口”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。