Dans GO, les interfaces sont différentes des autres langages de programmation populaires tels que Java, C ++, PHP. Ils présentent certains avantages de conception. Dans cet article, je vais essayer d'expliquer pourquoi.
Je vais couvrir les avantages, fournir des exemples et discuter de certains des problèmes qui peuvent survenir lors de l'utilisation d'interfaces.
Quelle est la particularité des interfaces dans GO?
. , python, js, ruby. , , . GO TypeScript. .
. , , , .
PHP:
class Human implements Walkable
{
…
}
class Mountain
{
public function walkAround(Walkable $walkable) {...}
}
:
$human = new Human();
$mountain = new Mountain();
$mountain.walkAround($human);
GO . , . , .
?
. . . - , . . , .. .
- , . .
.
, . . , :
package auth
import (
"gitlab.com/excercice_detection/backend"
)
type userRepository interface {
FindUserByEmail(email string) (backend.User, error)
AddUser(backend.User) (userID int, err error)
AddToken(userID int, token string) error
TokenExists(userID int, token string) bool
}
// Auth
type Auth struct {
repository userRepository
logger backend.Logger
}
// NewAuth
func NewAuth(repository userRepository, logger backend.Logger) *Auth {
return &Auth{repository, logger}
}
// Autentificate
func (auth Auth) Autentificate(userID int, token string) bool {
return auth.repository.TokenExists(userID, token)
}
, .
main :
package main
import (
"gitlab.com/excercice_detection/backend/auth"
"gitlab.com/excercice_detection/backend/mysql"
)
func main() {
logger := newLogger()
userRepository := mysql.NewUserRepository(logger)
err := userRepository.Connect()
authService := auth.NewAuth(userRepository, logger)
...
userRepository, , , mysql , . . . .
. , . . , .
, , .
, . , . , , .
, .
. .. . . . , , : , , .
. , . .
:
type userRepositoryMock struct {
user backend.User
findUserErr error
addUserError error
addUserID int
addTokenErr error
tokenExists bool
}
func (repository userRepositoryMock) FindUserByEmail(email string) (backend.User, error) {
return repository.user, repository.findUserErr
}
func (repository userRepositoryMock) AddUser(backend.User) (userID int, err error) {
return repository.addUserID, repository.addUserError
}
func (repository userRepositoryMock) AddToken(userID int, token string) error {
return repository.addTokenErr
}
func (repository userRepositoryMock) TokenExists(userID int, token string) bool {
return repository.tokenExists
}
, , userRepositoryMock userRepositor, , .
, . , , .
. , , , , , .
, , ?
, , , . , GO , . IDE GoLand .
, , . , .
, , ?
. . IDE , , . IDE , .
GO . , — , . , . , .
GO, . . , . GO , , .