Vorteile von Schnittstellen in GO

Vorteile von Schnittstellen in GO



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 , , .




All Articles