和@Ivan Velichko一样,我也曾经将接口设为公共的,结构体设为私有的,就像这样:
type Service interface {
Do() error
}
type service struct {
dependency dependencies.Dependency
}
func (s *service) Do() error {
return s.depedency.Do()
}
func NewService() Service {
return &service{}
}
然而,如果由于某些原因您必须使结构体或其属性公开,并且您不想编写大量的getter或setter,请考虑以下示例:
将interface
名称更具体化以执行操作
根据这些文章:
您应该:
按照惯例,单方法接口的命名方式是使用方法名称加上-er后缀或类似修改来构造代理名词:Reader、Writer、Formatter、CloseNotifier等。
type ServiceWorker interface {
HandleMessages() error
}
type Service struct {
dependency dependencies.Dependency
}
func (s *service) HandleMessages() error {
return s.depedency.Do()
}
func NewServiceWorker() Service {
return &service{
Property: "property"
}
}
创建用于获取/修改结构体的函数
type Service interface {
Do() error
Service() *service
}
type service struct {
dependency dependencies.Dependency
Property string
}
func (s *service) Do() error {
return s.depedency.Do()
}
func (s *service) Service() *service {
return s
}
func NewService() Service {
return &service{
Property: "property"
}
}
func main() {
s := pkg.NewService()
fmt.Println("p1:", s.Service().Property)
s.Service().Property = "second"
fmt.Println("p2:", s.Service().Property)
}
定义 getters 和 setters
以更 Java/C# 的方式定义 getters 和 setters:
type Service interface {
Do() error
Get() service
Set() *service
}
type service struct {
dependency dependencies.Dependency
Property string
}
func (s *service) Do() error {
return s.depedency.Do()
}
func (s service) Get() service {
return s
}
func (s *service) Set() *service {
return s
}
func NewService() Service {
return &service{
Property: "property"
}
}
UserManager
的实现应该反映出它从哪里/如何获取/修改其数据。例如:DBUserManager
,InMemoryUserManager
,CachingUserManager
。 - user142162