在 Go 語言中,一個 struct 實現了某個接口里的所有方法,就叫做這個 struct 實現了該接口。
下面寫一個 Demo 實現一下,先寫一個 Study interface{},里面需要實現 4 個方法 Listen、Speak、Read、Write,然后再寫一個 study struct{},去全部實現里面的方法,然后分享一下代碼心得。
代碼示例
// 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
接口被更改或未全部實現時,在編譯時就會報錯。
二、
type study struct {
Name string
}
之所以定義為私有的結構體,是因為不想在其他地方被使用,比如后面將 Name
改成 UserName
只需要在本包內修改即可。
三、
func New(name string) (Study, error) {
if name == "" {
return nil, errors.New("name required")
}
return &study{
Name: name,
}, nil
}
在其他地方調用 New()
使用 Study
包時,僅對外暴露了 4 個方法,別人只管調用就好了,內部實現別人無需關心。