這幾天一直在看GO語言知識,其中對接口的知識點有點模糊,所以整理一下。
1.先看一下接口的定義
type 接口名 interface{
方法名1(參數列表1) 返回值1
方法名2(參數列表2) 返回值2
...
}
注意:接口裏的方法可以爲空,也就是一個空接口。下面舉個例子:
//定義People接口,有一個說名字的方法
type People interface {
SayName() string
}
//聲明瞭一個People類型的變量p
var p People
2.接口的實現
如果一個對象實現了接口中的所有方法,則說這個對象實現了這個接口。Go語言中的不同類型可以實現同一個接口。舉例子:
//定義一個People接口
type People interface {
SayName() string
}
//定義一個學生類型
type Student struct {
Name string
}
//定義一個工人類型
type Worker struct {
Name string
}
//學生類型實現SayName方法
func (s Student)SayName() string {
return s.Name
}
//工人類型實現SayName方法
func (w Worker)SayName() string {
return w.Name
}
func main() {
var p People
student:= Student{Name:"張三"}
p = student
fmt.Println(p.SayName())
fmt.Printf("%T\n",p)
worker:=Worker{Name:"小王"}
p = worker
fmt.Println(p.SayName())
fmt.Printf("%T\n",p)
}
以上會輸出
張三
main.Student
小王
main.Worker
分析一下,定義了一個接口類型的People,裏面又SayName()方法,學生類型Student,然後定義了學生類型的方法,由於People接口只有一個方法,所以學生類型實現了People接口,main方法中p=student纔不會報錯,如果People中還有個Sing()唱歌的方法,學生類型沒有Sing()方法,p=student會提示:cannot use student (type Student) as type People in assignment:
Student does not implement People (missing Sing method)。工人類型和學生類型一樣,說明了不同類型可以實現同一個接口。
3.如何判斷是否實現了接口
//定義一個People接口
type People interface {
SayName() string
}
//定義一個學生類型
type Student struct {
Name string
}
//學生類型實現SayName方法
func (s Student)SayName() string {
return s.Name
}
//檢查結構體都實現了接口了沒有
func checkPepole(tmp interface{}) {
if _,ok:=tmp.(People);ok {
fmt.Println("Student implements People")
}
}
func main() {
student:= Student{Name:"張三"}
checkPepole(student)
}
4.空接口
如果一個接口裏面沒有任何方法,則稱爲空接口,任何類型都實現了空接口,所以任何類型都可以給空接口賦值。
func main(){
// 定義tmp爲空接口
var tmp interface{}
var i int = 5
var s string = "Hello world"
type Student struct{
Name string
}
student:=Student{Name:"張三"}
// tmp可以存儲任意類型的數值
tmp = i
tmp = s
tmp = student
}
5.接口斷言。
既然空接口可以存儲任何類型的數據,就需要判斷出變量的具體類型。
接口斷言有兩種方法,第一種是x.(type),x爲接口類型的變量,返回變量的類型,這種方法需要再switch case語句中使用。第二種是x.(T),x爲接口類型的變量,T爲x可能的類型,變量的值和是否是這個類型的結果。
//斷言-switch判斷
func JudgeTypeSwith(v interface{}) {
switch v.(type) {
case int:
fmt.Println("int類型")
case string:
fmt.Println("string類型")
case float64:
fmt.Println("float64類型")
default:
fmt.Println("unknown type")
}
}
//斷言 ok
func JudgeTypeComma(v interface{}){
if _,ok:=v.(string);ok {
fmt.Println("string 類型")
}else if _,ok :=v.(int);ok {
fmt.Println("int 類型")
}else if _,ok :=v.(Student);ok{
fmt.Println("Student 類型")
}else{
fmt.Println("未知類型")
}
}
func main(){
var a int
a = 10
JudgeTypeSwith(a)
var b string
b = "is a string"
JudgeTypeComma(b)
}