在 Go 語言中,一個 struct 實現了某個接口裏的全部方法,就叫作這個 struct 實現了該接口。git
下面寫一個 Demo 實現一下,先寫一個 Study interface{},裏面須要實現 4 個方法 Listen、Speak、Read、Write,而後再寫一個 study struct{},去所有實現裏面的方法,而後分享一下代碼心得。github
// main.go package main import ( "demo/study" "fmt" ) func main() { name := "Tom" s, err := study.New(name) if err != nil { fmt.Println(err) } fmt.Println(s.Listen("english")) fmt.Println(s.Speak("english")) fmt.Println(s.Read("english")) fmt.Println(s.Write("english")) } // 輸出 Tom 聽 english Tom 說 english Tom 讀 english Tom 寫 english
// study.go package study import "github.com/pkg/errors" var _ Study = (*study)(nil) type Study interface { Listen(msg string) string Speak(msg string) string Read(msg string) string Write(msg string) string } type study struct { Name string } func (s *study) Listen(msg string) string { return s.Name + " 聽 " + msg } func (s *study) Speak(msg string) string { return s.Name + " 說 " + msg } func (s *study) Read(msg string) string { return s.Name + " 讀 " + msg } func (s *study) Write(msg string) string { return s.Name + " 寫 " + msg } func New(name string) (Study, error) { if name == "" { return nil, errors.New("name required") } return &study{ Name: name, }, nil }
var _ Study = (*study)(nil)
要求 *study
去實現 Study
,若 Study
接口被更改或未所有實現時,在編譯時就會報錯。ui
type study struct { Name string }
之因此定義爲私有的結構體,是由於不想在其餘地方被使用,好比後面將 Name
改爲 UserName
只須要在本包內修改便可。code
func New(name string) (Study, error) { if name == "" { return nil, errors.New("name required") } return &study{ Name: name, }, nil }
在其餘地方調用 New()
使用 Study
包時,僅對外暴露了 4 個方法,別人只管調用就行了,內部實現別人無需關心。接口