GO介面定義與實現

2021-09-12 10:51:48 字數 4013 閱讀 8311

如果你看它像只鴨子,那麼它就是乙隻鴨子,這就是duck typeing的概念。如果你是個小朋友你可能會把它當作小黃鴨,如果你是個吃貨可能會把它當作是別的什麼東西。這個概念是有點抽像的。

先上段**看看go的介面定義與實現:

greenduck.go

package duck

type greenduck struct

func (duck greenduck)getinfo()string

yellowduck.go

package duck

type yellowduck struct

func (duck yellowduck)getinfo() string

doduck.go

package main

import (

"fmt"

"go_study/007_struct_inte***ce/duck"

)type duck inte***ce

func get(duck duck) string

func main()

執行doduck.go的結果是:

this is a green duck .

this is a yellow duck .

結果分析:

func get(duck duck) string

順便說一下建構函式

和別的語言不太一樣,go沒有建構函式,但是同樣的靈活,先改造一下上面的**吧

yellowduck.go 把yellowduck的值放在yellowduck struck的肚子裡,成為結構體的一部分,這樣就可以在建立時分配相應的記憶體空間,並為其賦值。看下面的**:

package duck

type yellowduck struct

func (duck yellowduck)getinfo() string

doduck.go

package main

import (

"fmt"

"go_study/007_struct_inte***ce/duck"

)type duck inte***ce

func getduck(duck duck) string

func main()

fmt.println(getduck(yellowduck))

}

可以看出雖然go沒有建構函式,但是在建立時可以隨意為記憶體空間賦值,非常的靈活,如果你想對一些構造加一些業務限制的話,你可以建立乙個create函式 , 見下面**:

yellowduck.go

package duck

import (

"errors"

"strings"

)type yellowduck struct

func createyellowduck(content string,age int) (yellowduck yellowduck,err error)

if age <= 0

yellowduck = yellowduck

return

}func (duck yellowduck)getinfo() string

doduck.go

package main

import (

"fmt"

"go_study/007_struct_inte***ce/duck"

)type duck inte***ce

func getduck(duck duck) string

func main() else

}

你也可以把

func createyellowduck(content string,age int) (yellowduck yellowduck,err error)

寫成func (duck yellowduck) createyellowduck(content string,age int) (yellowduck yellowduck,err error)

區別僅僅是用包名引用還是用struct引用,對於函式式程式設計來說沒什麼區別

介面的值型別:

依舊是先看段**

green/duck.go

package green

import (

"strconv"

)type duck struct

func (duck *duck)getinfo()string

yellow/duck.go

package yellow

import (

"strconv"

)type duck struct

func (duck duck)getinfo()string

doduck.go

package main

import (

"fmt"

"go_study/007_struct_inte***ce/green"

"go_study/007_struct_inte***ce/yellow"

)type duck inte***ce

func getduck(duck duck) string

func main()

fmt.printf("type -> %t , v->%v\n",duck,duck)

inpect(duck)

duck = yellow.duck

fmt.printf("type -> %t , v->%v\n",duck,duck)

inpect(duck) }

func inpect(duck duck)

}

找區別:yellow/duck.go與green/duck.go的區別

green的getinfo()實現是指標

func (duck *duck)getinfo()string

yellow的getinfo實現是

func (duck duck)getinfo()string

green的介面變數獲取是

duck = &green.duck
yellow的介面變數獲取是

duck = yellow.duck
green duck的結構體是

type duck struct
yellow duck的結構體是

type duck struct
看功能,可以做到:

1、不同的結構體但是都有getinfo方法,都被認為是duck

2、可以檢視不同duck實現的型別及內容

3、可以判斷不同型別的duck來做不同的事情

4、介面變數不只是個指標,它肚子裡還有型別和內容

5、同樣的介面實現,可以支援傳指標或是傳值 如:func (duck *duck)getinfo()string 與 func (duck duck)getinfo()string

另外golang介面也是可以繼承的,比較簡單這裡就不做描述了

Go語言介面定義與用法示例

在go中,介面inte ce其實和其他語言的介面意思也沒什麼區別。inte ce理解其為一種型別的規範或者約定。一種型別是不是 實現 了乙個介面呢?就看這種型別是不是實現了介面中定義的所有方法。1.介面的定義和使用。比如複製 如下 type i inte ce 這段話就定義了乙個介面,它包含兩個函式...

介面的定義與實現

作用 1.約束 2.定義一些方法,讓不同的人實現 3.介面不能被例項化,介面中沒有構造方法。4.implements可以實現多個介面 5.public abstract 6.public static final 7.必須要重寫介面內的方法 8.介面就是規範 定義 public inte ce us...

C 介面的定義與實現

1.介面的定義與實現 所謂的介面,即將內部實現細節封裝起來,外部使用者用過預留的介面可以使用介面的功能而不需要知曉內部具體細節。c 中,通過類實現物件導向的程式設計,而在基類中只給出純虛函式的宣告,然後在派生類中實現純虛函式的具體定義的方式實現介面,不同派生類實現介面的方式也不盡相同,從而實現多型。...