Ressentir Lombok en Golang

Ressentir Lombok en Golang

24 octobre 2023

Lombok ?

Lombok est une bibliothèque en Java qui réduit les codes répétitifs tels que les getter et setter.

En Go, les tâches telles que les getters, setters ou constructeurs peuvent être très fastidieuses en raison de ses caractéristiques.

Dans le cas de Java, il existe une bibliothèque pour automatiser ces tâches.

Prenons un exemple en supposant que l’on crée un constructeur pour la structure suivante :

type User struct {
    Name string
    Age int
}

La plupart d’entre nous devront probablement créer un constructeur comme suit :

func NewUser(name string, age int) User {
    return User{
        Name: name,
        Age: age,
    }
}

En Java, la création de constructeur est généralement effectuée de cette manière :

public class User {
    private String name;
    private int age;
    
    public User(String name, int age){
        this.name = name;
        this.age = age;
    } 
}

Lombok est une bibliothèque qui automatise ce travail. En utilisant Lombok, cela peut être fait ainsi :

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

Il s’agit d’une bibliothèque qui aide les développeurs en réduisant les tâches répétitives, les erreurs humaines, etc.

Gombok

Compte tenu des nombreuses structures de code nécessaires en Go, il devient difficile de se concentrer sur le code métier lorsque l’on doit répéter ces codes. (Je suis peut-être juste paresseux..) En réfléchissant à une façon d’automatiser cela, j’ai créé une bibliothèque de générateur de code appelée gombok en combinant lombok et go pour être utilisée efficacement en entreprise.

Installation

Il est facile de l’installer avec la commande install :

 $ go install github.com/YangTaeyoung/gombok@v1.1.0

Utilisation

Il suffit d’ajouter des annotations, comme en Lombok, dans les commentaires des structures que l’on souhaite utiliser.

// @AllArgsConstructor
// @Builder
// @Getter
// @Setter
type User struct {
    Name string
    Age int
}

Et il suffit de l’exécuter de la façon suivante. Il n’est pas nécessaire de spécifier des options particulières, et l’exécution de cette commande génère un fichier {nom_du_fichier}_gombok.go.

$ gombok

> main.go
> 2023/10/24 23:25:39 Found @AllArgsConstructor in User
> 2023/10/24 23:25:39 Found @Builder in User
> 2023/10/24 23:25:39 Found @Getter in User
> 2023/10/24 23:25:39 Found @Setter in User

En ouvrant ce fichier, on constate que le constructeur, le builder, les Getters et les Setters ont été créés comme suit :

// Code generated by gombok. DO NOT EDIT.
package main

// NewUserWithAllArgs
func NewUserWithAllArgs(name string, age int) User {
	return User{
		Name: name,
		Age:  age,
	}
}

// UserBuilder
// a builder for User
type UserBuilder struct {
	target *User
}

// WithName
// sets the Name field of the target User
func (ub UserBuilder) WithName(name string) UserBuilder {
	ub.target.Name = name

	return ub
}

// WithAge
// sets the Age field of the target User
func (ub UserBuilder) WithAge(age int) UserBuilder {
	ub.target.Age = age

	return ub
}

// Build
// constructs a User from the builder
func (ub UserBuilder) Build() User {
	return *ub.target
}

// NewUserBuilder
// creates a new builder instance for User
func NewUserBuilder() UserBuilder {
	return UserBuilder{target: &User{}}
}

// GetName
func (u *User) GetName() string {
	return u.Name
}

// GetAge
func (u *User) GetAge() int {
	return u.Age
}

// SetName
func (u *User) SetName(name string) {
	u.Name = name
}

// SetAge
func (u *User) SetAge(age int) {
	u.Age = age
}

Vous pouvez simplement utiliser les fonctions de receveur générées où vous le souhaitez.

// @AllArgsConstructor
// @Builder
// @Getter
// @Setter
type User struct {
	Name string
	Age  int
}

func main() {
	user := NewUserBuilder().WithAge(10).WithName("John").Build()

	fmt.Println(user.GetName(), user.GetAge())

	user.SetName("Jane")
	user.SetAge(20)

	fmt.Println(user.GetName(), user.GetAge())

	user2 := NewUserWithAllArgs("giraffe", 27)

	fmt.Println(user2.GetName(), user2.GetAge())
}

Résultat

John 10
Jane 20
giraffe 27