溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

go語言interface接口繼承多態(tài)怎么定義

發(fā)布時(shí)間:2022-04-15 13:53:01 來源:億速云 閱讀:178 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“go語言interface接口繼承多態(tài)怎么定義”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    1.什么是接口

    接口就是一種規(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)那些功能。

    2.接口定義

    接口定義的語法如下:

    方式一: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é)尾。

    3.多態(tài)

    接口有什么好處呢?實(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)
    }

    多態(tài)加減計(jì)算器

    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)
    }

    4.接口繼承與轉(zhuǎn)換

    接口也可以實(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("大碗面")
    }

    5.空接口

    空接口(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ù)。

    6.接口轉(zhuǎn)換

    結(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()
    }

    7.實(shí)現(xiàn)map字典接口

    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)
    }

    8.interface案例

    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í)用文章!

    向AI問一下細(xì)節(jié)

    免責(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)容。

    AI