對於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 類型的指針的方法集既包含值接收者聲明的方法,也包含指針接收者聲明的方法. 也就是說 若是方法集使用的是指針類型,那麼咱們必須傳入指針類型的值,若是方法集使用的是指類型,那麼咱們既能夠傳入值類型也能夠傳入指針類型