如果你看它像只鴨子,那麼它就是乙隻鴨子,這就是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 中,通過類實現物件導向的程式設計,而在基類中只給出純虛函式的宣告,然後在派生類中實現純虛函式的具體定義的方式實現介面,不同派生類實現介面的方式也不盡相同,從而實現多型。...