Go的學習旅程4 面向介面

2021-08-20 05:35:54 字數 4641 閱讀 3725

因為go中沒有class,只有結構體和方法,所以不存在class的繼承與多型,但是我們可以通過inte***ce來實現類似class的繼承

1.1專案位置關係圖

1.2各個檔案中的**

queue.go

package queue

import (

"fmt"

"strconv")//

這裡有兩個方法體

type

queue int

type

human

struct

//新增佇列

func (q

*queue) push(a

int) queue

//消耗佇列

func (q

*queue) pop() int

//介紹

func (h

human) sayhi()

//唱歌

func (h

human) sing(lyrics

string)

//注意

:輸出的型別是

string,

那麼phone

就得轉化為

string

func (h

human) see(name

string) string

rel.go

package queue

import (

"strconv"

"fmt"

)type

dier

struct

func (d

dier) see(name

string) string

func (d

dier) sayhi()

func (d

dier)sing(lyrics

string)

main.go

package main

import (

"fmt"

"../../queue")//

通過介面

,來繼承

sayhi

和sing(

只能引用匯入包其中的乙個檔案中

,可以說是選擇性的繼承

)type

men

inte***ce

func

diao(r

men) string

func

main()

fmt.println(q

.push(5))

fmt.println(q

.pop())

fmt.println(q

) //i

繼承了sayhi

和sing,

直接呼叫

var

i men

i = queue.human

i.sayhi()

i.sing("18

歲的天空

") fmt.println(i

.see("

三狗子"))

//通過函式

,呼叫不同介面

//呼叫第一種

var

r men

r=queue.human

fmt.println(diao(r

)) //

呼叫第二種

r=queue.dier

fmt.println(diao(r

))}

這裡通過inte***ce來呼叫sayhi(),see()和sing()方法,這裡被稱為men的隱藏字段(和class繼承的道理是一樣的)
type 

men

inte***ce

值得注意的是,因為human和dier中的方法是一樣的,所以men理論上是都可以繼承的,但是需要在r賦值中宣告

var 

r men

r=queue.human

fmt.println(diao(r

)) //

呼叫第二種

r=queue.dier

fmt.println(diao(r

))

結果展示:

因為go中也是可以同級呼叫,或外部呼叫的,效果如下

2.1專案位置關係圖

1.2各個檔案中的**

jiben.go是該例子中最底層封裝的結構體

package duo

import

"strconv"

type

jb struct

func (j

jb) jieshao() string

func (j

jb) mubiao(number

int) string

study.go中的student在jiben.go的基礎上,呼叫了jb引數並讓xx繼承了jieshao() string和mubiao(number int) string函式

package duo

import (

"strconv"

)type

student

struct

type

xx inte***ce

func (s

student) jie() string

func (s

student) zhen(num

int) string

func (s

student) zhu() string

最後的main.go不僅讓ren繼承jieshao() string和mubiao(number int) string,xiao繼承了jie() string

,zhen(num int) string和zhu() string,而且使得duo繼承了xiao,duo.xx,必須主意的是,因為duo.xx和ren本質上是相同的,所以只需要引入乙個即可;

package main

import (

"fmt"

"../../duo")//

繼承jb

type

ren

inte***ce

//繼承

student

type

xiao

inte***ce

//繼承

ren(duo.xx)

和xiao,

因為ren

和duo.xx

是重複呼叫的

,所以只能調其中的乙個

,不能多次呼叫

type

duo

inte***ce

//呼叫者來申明介面

func

main()

fmt.println(i

.jieshao())

fmt.println(i

.mubiao(18))

fmt.println("

王二丫結束

") //

呼叫外部

var

j xiao

//noinspection all

j = duo.student,

"山西大學",

5000}

fmt.println(j

.jie())

fmt.println(j

.zhen(9999))

fmt.println(j

.zhu())

fmt.println("

李二櫃結束

") //

組合呼叫

var

w duo

w = duo.student,

"理工大學",

6000}

fmt.println(w

.jieshao())

fmt.println(w

.jie())

fmt.println(w

.mubiao(30))

}

執行main.go

結果展示:

Go的學習旅程3 物件導向

在go中,是沒有類class的定義的,但是類似於class的是type package main import fmt 定義乙個類 type person struct 建構函式 func con name string,age,tel int person 方法 func aaa person f...

Go語言面向介面

python中的鴨子型別 def duck run duck duck.run 與python類似,go語言中也有鴨子型別。在go語言中介面的型別是inte ce type retriever inte ce 接著我們穿件包retriever,然後在包中實現retriever type retrie...

學習旅程之Neo4j

1.關於命令列啟動資料庫伺服器的問題 neo4j zip環境設定 warning this batch script has been deprecated.please use the provided powershe ll scripts instead 然後換了3.1.0版本,這個版本中沒有...