In GO unterscheiden sich die Schnittstellen von anderen gängigen Programmiersprachen wie Java, C ++, PHP. Sie haben einige Designvorteile. In diesem Artikel werde ich versuchen zu erklären warum.
Ich werde die Vorteile behandeln, Beispiele bereitstellen und einige der Probleme diskutieren, die bei der Verwendung von Schnittstellen auftreten können.
Was ist das Besondere an Schnittstellen in 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 , , .