您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“go語言interface接口繼承多態(tài)怎么定義”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
接口就是一種規(guī)范與標(biāo)準(zhǔn),在生活中經(jīng)常見接口,例如:筆記本電腦的USB接口,可以將任何廠商生產(chǎn)的鼠標(biāo)與鍵盤,與電腦進(jìn)行鏈接。為什么呢?原因就是,USB接口將規(guī)范和標(biāo)準(zhǔn)制定好后,各個(gè)生產(chǎn)廠商可以按照該標(biāo)準(zhǔn)生產(chǎn)鼠標(biāo)和鍵盤就可以了。
在程序開發(fā)中,接口只是規(guī)定了要做哪些事情,干什么。具體怎么做,接口是不管的。這和生活中接口的案例也很相似,例如:USB接口,只是規(guī)定了標(biāo)準(zhǔn),但是不關(guān)心具體鼠標(biāo)與鍵盤是怎樣按照標(biāo)準(zhǔn)生產(chǎn)的.
在企業(yè)開發(fā)中,如果一個(gè)項(xiàng)目比較龐大,那么就需要一個(gè)能理清所有業(yè)務(wù)的架構(gòu)師來定義一些主要的接口,這些接口告訴開發(fā)人員你需要實(shí)現(xiàn)那些功能。
接口定義的語法如下:
方式一:interface接收任意數(shù)據(jù)格式 //先定義接口 一般以er結(jié)尾 根據(jù)接口實(shí)現(xiàn)功能 type CurrencyEr2 interface{ Symbol() string } 方式二:指定類型 type Currency string
怎樣具體實(shí)現(xiàn)接口中定義的方法呢?
func (c Currency)Symbol() string { m := "" switch c { case "CNY": // 人民幣 m = "¥" case "KRW": // 韓幣 m = "?" case "TWD": // 臺幣 m = "$" case "JPY": // 日元 m = "¥" case "USD": // 美元 m = "$" } return m }
具體的調(diào)用如下:
func main() { // 方式一: a:=CurrencyEr2(Currency("CNY")).Symbol() fmt.Println(a) // 方式二: b:=Currency("CNY").Symbol() fmt.Println(b) }
只要類(結(jié)構(gòu)體)實(shí)現(xiàn)對應(yīng)的接口,那么根據(jù)該類創(chuàng)建的對象,可以賦值給對應(yīng)的接口類型。
接口的命名習(xí)慣以er結(jié)尾。
接口有什么好處呢?實(shí)現(xiàn)多態(tài)。
多態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作
所謂多態(tài)指的是多種表現(xiàn)形式,如下圖所示:
使用接口實(shí)現(xiàn)多態(tài)的方式如下:
package main import "fmt" //先定義接口 一般以er結(jié)尾 根據(jù)接口實(shí)現(xiàn)功能 type CurrencyEr2 interface { //方法 方法的聲明 Symbol() string } type Currency string type Currency2 string func (c Currency) Symbol() string { m := "" switch c { case "CNY": m = "¥" } return m } func (c Currency2) Symbol() string { m := "" switch c { case "USD": m = "$" } return m } //多態(tài)的實(shí)現(xiàn) //將接口作為函數(shù)參數(shù) 實(shí)現(xiàn)多態(tài) func Start(c CurrencyEr2) string { return c.Symbol() } func main() { //調(diào)用多態(tài)函數(shù) a := Start(Currency("CNY")) fmt.Println(a) //調(diào)用多態(tài)函數(shù) b := Start(Currency2("USD")) fmt.Println(b) }
package main import "fmt" //定義接口 type Opter interface { //方法聲明 Result() int } //父類結(jié)構(gòu)體 type Operate struct { num1 int num2 int } //加法子類結(jié)構(gòu)體 type Add struct { Operate } //實(shí)現(xiàn)加法子類的方法 func (a *Add) Result() int { return a.num1 + a.num2 } //減法子類結(jié)構(gòu)體 type Sub struct { Operate } //實(shí)現(xiàn)減法子類的方法 func (s *Sub) Result() int { return s.num1 - s.num2 } //創(chuàng)建一個(gè)類負(fù)責(zé)對象創(chuàng)建 //工廠類 type Factory struct { } func (f *Factory) Result(num1 int, num2 int, ch string) int { sum := 0 switch ch { case "+": var a Add a.num1 = num1 a.num2 = num2 sum = Opter.Result(&a) case "-": var s Sub s.num1 = num1 s.num2 = num2 sum = Opter.Result(&s) } return sum } //通過設(shè)計(jì)模式調(diào)用 func main() { //創(chuàng)建工廠對象 var f Factory a:= f.Result(10, 20, "+") fmt.Println(a) }
接口也可以實(shí)現(xiàn)繼承:
package main import "fmt" //先定義接口 一般以er結(jié)尾 根據(jù)接口實(shí)現(xiàn)功能 type Humaner2 interface { //子集 //方法 方法的聲明 sayhi() } type Personer interface { //超集 Humaner2 //繼承sayhi() sing(string) } type student13 struct { name string age int score int } func (s *student13)sayhi() { fmt.Printf("大家好,我是%s,今年%d歲,我的成績%d分\n",s.name,s.age,s.score) } func (s *student13)sing(name string) { fmt.Println("我為大家唱首歌",name) } func main() { //接口類型變量定義 var h Humaner2 var stu student13 = student13{"小吳",18,59} h = &stu h.sayhi() //接口類型變量定義 var p Personer p = &stu p.sayhi() p.sing("大碗面") }
接口繼承后,可以實(shí)現(xiàn)“超集”接口轉(zhuǎn)換“子集”接口,代碼如下:
package main import "fmt" //先定義接口 一般以er結(jié)尾 根據(jù)接口實(shí)現(xiàn)功能 type Humaner2 interface { //子集 //方法 方法的聲明 sayhi() } type Personer interface { //超集 Humaner2 //繼承sayhi() sing(string) } type student13 struct { name string age int score int } func (s *student13)sayhi() { fmt.Printf("大家好,我是%s,今年%d歲,我的成績%d分\n",s.name,s.age,s.score) } func (s *student13)sing(name string) { fmt.Println("我為大家唱首歌",name) } func main() { //接口類型變量定義 var h Humaner2 //子集 var p Personer //超集 var stu student13 = student13{"小吳",18,59} p = &stu //將一個(gè)接口賦值給另一個(gè)接口 //超集中包含所有子集的方法 h = p //ok h.sayhi() //子集不包含超集 //不能將子集賦值給超集 //p = h //err //p.sayhi() //p.sing("大碗面") }
空接口(interface{})不包含任何的方法,正因?yàn)槿绱耍械念愋投紝?shí)現(xiàn)了空接口,因此空接口可以存儲任意類型的數(shù)值。
例如:
var i interface{} //接口類型可以接收任意類型的數(shù)據(jù) //fmt.Println(i) fmt.Printf("%T\n",i) i = 10 fmt.Println(i) fmt.Printf("%T\n",i)
當(dāng)函數(shù)可以接受任意的對象實(shí)例時(shí),我們會(huì)將其聲明為interface{},最典型的例子是標(biāo)準(zhǔn)庫fmt中PrintXXX系列的函數(shù),例如:
func Printf(fmt string, args ...interface{}) func Println(args ...interface{})
如果自己定義函數(shù),可以如下:
func Test(arg ...interface{}) { }
Test( )函數(shù)可以接收任意個(gè)數(shù),任意類型的參數(shù)。
結(jié)論:超集可以轉(zhuǎn)換為子集,子集不可以轉(zhuǎn)換為超集
package main import "fmt" type Humaner interface { //子集 sayhi() } type Personer interface { //超集 Humaner //匿名字段,繼承了sayhi() sing(lrc string) } type Student struct { name string id int } //Student實(shí)現(xiàn)了sayhi() func (tmp *Student) sayhi() { fmt.Printf("Student[%s, %d] sayhi\n", tmp.name, tmp.id) } func (tmp *Student) sing(lrc string) { fmt.Println("Student在唱著:", lrc) } func main() { //超集可以轉(zhuǎn)換為子集,反過來不可以 var iPro Personer //超集 iPro = &Student{"mike", 666} var i Humaner //子集 //iPro = i //err i = iPro //可以,超集可以轉(zhuǎn)換為子集 i.sayhi() }
package main import ( "fmt" "sync" ) type UserAges struct { ages map[string] int sync.Mutex } func (u *UserAges)Add(name string,age int) { u.Lock() defer u.Unlock() u.ages[name] = age } func (u *UserAges)Get(name string)int{ if age,ok:=u.ages[name];ok{ return age } return -1 } func main() { dic:=make(map[string]int) dic["age"] = 18 r:=UserAges{ages: dic} r.Add("jeff",20) fmt.Println(r) age:=r.Get("age") fmt.Println(age) }
package main import "fmt" type Bike interface { save() update() insert() } type User struct { name string } func (this *User) save() { fmt.Println("保存成功", this.name) } func (this *User) update() { fmt.Println("更新成功", this.name) } func (this *User) insert() { fmt.Println("插入成功", this.name) } func main() { var data Bike = &User{name: "jeff"} data.save() data.update() data.insert() }
“go語言interface接口繼承多態(tài)怎么定義”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。