Go學習筆記-接口(interface)的實現

對於go的接口,咱們先來看看官方的解釋php

接口是用來定義行爲的類型。這些被定義的行爲不禁接口直接實現,而是經過方法由用戶定義的類型實現。若是用戶定義的類型實現了某個接口類型聲明的一組方法,那麼這個用戶定義的類型的值就能夠賦給這個接口類型的值。這個賦值會把用戶定義的類型的值存入接口類型的值

也就是說接口定義的方法,須要由具體的類型去實現它。segmentfault

下面咱們來看看接口的實現
在go語言中,接口的實現與 struct的繼承同樣,不須要經過某個關鍵字 php:implements來聲明。在 go中一個類只要實現了某個接口要求的全部方法,咱們就說這個類實現了該接口。下面來看一個例子
type NoticeInterface interface {  
   seedEmail()  
   seedSMS()  
}  
  
type Student struct {  
   Name string  
  Email string  
  Phone string  
}  
  
func (Student *Student)seedEmail()  {  
   fmt.Printf("seedEmail to %s\r\n",Student.Email)  
}  
  
func (Student *Student)seedSMS()  {  
   fmt.Printf("seedSMS to %s\r\n",Student.Email)  
}

這裏咱們就說 student實現了 NoticeInterface接口。下面來看看接口的調用是否成功spa

func main()  {  
   student := Student{"andy","jiumengfadian@live.com","10086"}  
   //seedNotice(student)  //這裏會產生一個錯誤
   seedNotice(&student)  
}  
  
//建立一個seedNotice方法,須要接受一個實現了`NoticeInterface`類型  
func seedNotice(notice NoticeInterface)  {  
   notice.seedEmail()  
   notice.seedSMS()  
}

在上面的例子中,咱們建立了一個seedNotice須要接受一個實現了NoticeInterface的類型。可是我在main中第一個調用該方法的時候,傳入了一個student值。這個時候會產生一個錯誤指針

.\main.go:26:12: cannot use student (type Student) as type NoticeInterface in argument to seedNotice:
    Student does not implement NoticeInterface (seedEmail method has pointer receiver)

意思是student沒有實現NoticeInterface不能做爲NoticeInterface的類型參數。爲何會有這樣的錯誤呢?咱們在來看看上面的code

func (Student *Student)seedEmail()  {  
   fmt.Printf("seedEmail to %s\r\n",Student.Email)  
}  
  
func (Student *Student)seedSMS()  {  
   fmt.Printf("seedSMS to %s\r\n",Student.Email)  
}

這裏咱們對seedEmail,seedSMS的實現都是對於*Student也就是student的地址類型的,
因此咱們這也就必須傳入一個student的指針seedNotice(&student)
這裏給出一個規範中的方法集描述繼承

method receivers values
(t T) T and *T
(t *T) t *T
描述中說到,T 類型的值的方法集只包含值接收者聲明的方法。而指向 T 類型的指針的方法集既包含值接收者聲明的方法,也包含指針接收者聲明的方法. 也就是說 若是方法集使用的是指針類型,那麼咱們必須傳入指針類型的值,若是方法集使用的是指類型,那麼咱們既能夠傳入值類型也能夠傳入指針類型
期待一塊兒交流

短腿子猿

相關文章
相關標籤/搜索