Ressentir Lombok en Golang
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