在 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 个方法,别人只管调用就行了,内部实现别人无需关心。接口