go面向对象之多态即接口(interface)
生活随笔
收集整理的這篇文章主要介紹了
go面向对象之多态即接口(interface)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Go 語言接口
Go 語言提供了另外一種數據類型即接口,它把所有的具有共性的方法定義在一起,任何其他類型只要實現了這些方法就是實現了這個接口。
實例
/* 定義接口 */
type interface_name interface {
method_name1 [return_type]
method_name2 [return_type]
method_name3 [return_type]
...
method_namen [return_type]
} /* 定義結構體 */
type struct_name struct {
/* variables */
} /* 實現接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
/* 方法實現 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
/* 方法實現*/
}
a、定義多個結構體
b、為每個結構體定義一個相同的方法,比如我們下面的事例,Say
c、定義一個接口,這個接口的內容就是步驟b定義的Say()方法
d、在定義一個函數,這個函數,這個函數的參數類型就是步驟c定義的接口
e、調用步驟d的函數,傳遞一個步驟b定義的結構體進去 就實現了多態
1、go語言的多態是用接口來實現的interface
package main import "fmt" //面向對象的多態是通過接口interface來實現的,不同的對象,調用相同的接口,實現不同的效果 //go語言中,接口interface是一個自定義類型,描述了一系列方法的集合,關鍵字interface
//接口不能被實例化 //定義接口的方法
//type 接口名字 interface {
//
//} //接口的名字一般以er結尾 //定義一個Personer的接口
type Personer interface {
Say()
} //定義一個學生的結構體 type Studentxxx struct {
name string
score int
} type Teacherxxx struct {
name string
class string
} func (s *Studentxxx) Say () {
fmt.Println(s.name,s.score)
} func (s *Teacherxxx) Say () {
fmt.Println(s.name,s.class)
} type Mystring string func (m Mystring) Say () {
fmt.Println("自定義標準類型")
} //go語言的多態來實現
func Whosay(i Personer) {
i.Say()
} func main() {
sxxxx := &Studentxxx{name:"張三",score:12}
txxxx := &Teacherxxx{name:"李四",class:"一年級"} var my Mystring = "ABC" sxxxx.Say()
txxxx.Say()
my.Say()
//張三 12
//李四 一年級
//自定義標準類型 //go語言實現多態
Whosay(sxxxx)
Whosay(txxxx)
Whosay(my) //張三 12
//李四 一年級
//自定義標準類型 //練習一下make,創建一個數組
x := make([]Personer,3) x[0],x[1],x[2] = sxxxx,txxxx,my
for _,value := range x {
value.Say()
}
//張三 12
//李四 一年級
//自定義標準類型
}
2、interface接口實現繼承
//定義一個Personer的接口
type Personer interface {
Say()
} //接口也可以繼承,我們這里寫了一個Personer1的接口,這個接口繼承Personer這個接口,也就是說Personer1
//這個接口也有Say這個方法了,我們同樣也為Personer1這個接口定義了自己的方法,Run()
type Personer1 interface {
Personer
Run()
}
定義了結構體
type Personxxxx struct {
name string
class string
age int
}
定義一個函數
//go語言的多態來實現
func Whosay(i Personer) {
i.Say()
}
為繼承的接口定義方法
func (s2 *Personxxxx) Say() {
fmt.Println("接口的繼承測試1")
}
func (s2 *Personxxxx) Run() {
fmt.Println("接口的繼承測試2")
}
p2 := &Personxxxx{name:"p2222",class:"二年級",age:12}
p2.Say()
p2.Run()
//接口的繼承測試1
//接口的繼承測試2
Whosay(p2)
//接口的繼承測試1
3、if格式的類型判斷
package main import (
"fmt"
) //接口類型判斷 //定義一個空接口
type Niler interface {
} type PersonTest struct {
name string
age int } func main() {
//定義一個接口類型的切片
list := make([] Niler,3)
list[0] = 1
list[1] = "hello"
list[2] = PersonTest{name:"erBi",age:12} for k,v := range list {
//類型斷言,返回的兩個參數,一個是value,一個是ok,value是變量的值,ok是返回的布爾值
//comma-ok斷言
//這里的例子就是通過上面的返回值v來判斷v的類型,如果v的類型為int。則ok為true
_,ok := v.(int)
if ok {
fmt.Println(k,v,"數字")
} else if _,ok := v.(string);ok{
fmt.Println(k,v,"字符串")
} else if value,ok := v.(PersonTest);ok {
fmt.Println(value.name,"結構體")
} else {
fmt.Println("錯誤的數據類型")
}
}
//0 1 數字
//1 hello 字符串
//erBi 結構體
}
4、switch的類型判斷
總結
以上是生活随笔為你收集整理的go面向对象之多态即接口(interface)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift编码总结7
- 下一篇: 大闸蟹的项目分析——CSDN APP