go語言中的接口

這幾天一直在看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)
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章