// guide technique

Convertir du WLangage en Go : méthode, équivalences et pièges

Go est une cible de choix pour les applications WinDev orientées services, outils internes ou backends : compilé, statiquement typé, déployable en binaire unique sans runtime. La syntaxe est plus stricte que le WLangage, mais la traduction est directe une fois qu'on a compris deux idiomes fondamentaux : l'absence d'exceptions et les valeurs de retour multiples.

Prérequis : exporter le code en format texte

Avant toute conversion, enregistrez vos projets en format texte dans WinDev (option de compatibilité Git). Vous obtenez des fichiers WLangage lisibles, base idéale pour une conversion assistée par IA. Notre guide complet sur la préparation : migrer depuis WinDev.

Équivalences de base WLangage → Go

WLangageGo
chaîne, entier, réel, booléenstring, int, float64, bool
x est une chaîne = "abc"x := "abc"
POUR i = 1 À 10 ... FINfor i := 1; i <= 10; i++ { }
TANTQUE condition ... FINfor condition { }
SELON ... CASswitch ... case
tableau de chaînes[]string
structurestruct
procédurefunc (sans valeur de retour)
fonction retournant un entierfunc ... int
ChaîneConstruit(...)fmt.Sprintf(...)
DateSys()time.Now()
SI condition ... SINON ... FINif condition { } else { }

L'idiome Go le plus dépaysant : la gestion d'erreur

WLangage utilise les exceptions et les procédures d'erreur (QUAND EXCEPTION DANS). Go n'a pas d'exceptions : chaque fonction qui peut échouer retourne une valeur d'erreur en second paramètre. C'est verbeux mais explicite — et c'est ce qui rend le code Go si facile à tracer en production.

WLangage
QUAND EXCEPTION DANS
  OuvreConnexion(sConnexion)
  HExécuteRequêteSQL(reqSQL)
FAIRE
  Erreur("Connexion échouée : " +
        ErreurInfo())
FIN
Go
db, err := sql.Open("postgres", dsn)
if err != nil {
    return fmt.Errorf(
        "connexion échouée : %w", err)
}
_, err = db.Exec(query)
if err != nil {
    return fmt.Errorf(
        "requête échouée : %w", err)
}

Accès aux données : de HFSQL à database/sql

Le parcours de fichier HFSQL — l'idiome central du WLangage — se traduit en requête SQL explicite via le package standard database/sql, ou via un ORM comme GORM pour les projets CRUD denses.

WLangage
POUR TOUT Commande
  OÙ DateCmd >= DateDébut
  ET Statut = "Validée"
  Total += Commande.MontantHT
FIN
Go / database/sql
rows, err := db.Query(`
  SELECT MontantHT FROM Commande
  WHERE DateCmd >= $1
    AND Statut = 'Validée'`, dateDebut)
if err != nil { return err }
defer rows.Close()
for rows.Next() {
    var montant float64
    rows.Scan(&montant)
    total += montant
}

Les fonctions HLitRecherche, HAjoute, HModifie deviennent des db.QueryRow, db.Exec, ou des opérations GORM classiques. La migration de la base elle-même est traitée dans notre guide HFSQL vers SQL Server, PostgreSQL, MySQL ou MariaDB.

Tableaux et slices : l'indexation à 0

WLangage (index à 1)
MonTableau est un tableau
  de chaînes = ["a","b","c"]
Info(MonTableau[1]) // "a"
Info(MonTableau[3]) // "c"
Go (index à 0)
s := []string{"a", "b", "c"}
fmt.Println(s[0]) // "a"
fmt.Println(s[2]) // "c"
// range pour parcourir
for i, v := range s { ... }

Pièges classiques de la conversion WLangage → Go

Go comme cible pour les services extraits de WinDev. Go brille particulièrement quand l'application WinDev est en réalité un outil interne, un service de traitement ou un backend d'API. Le binaire unique sans dépendance, la performance et la concurrence native (goroutines) en font une alternative solide à .NET pour ces cas d'usage. Pour les applications de gestion CRUD avec IHM riche, C# / Blazor ou Python / Django restent souvent plus adaptés.

Concurrence : goroutines vs WLangage

WLangage gère la concurrence via les threads et tâches asynchrones (LanceTâche, MutexVerrou). Go expose un modèle plus simple avec les goroutines et les channels, qui se prête naturellement à la parallélisation de traitements HFSQL lourds.

WLangage
// traitement séquentiel d'un lot
POUR TOUT Facture
  TraiterFacture(Facture.ID)
FIN
Go / goroutines
var wg sync.WaitGroup
for _, id := range ids {
    wg.Add(1)
    go func(fid int) {
        defer wg.Done()
        traiterFacture(fid)
    }(id)
}
wg.Wait()

Faites estimer la conversion de votre application

Envoyez-nous les métriques de votre projet (nombre de fenêtres, lignes de code, taille de l'analyse) : nous vous retournons une estimation argumentée, gratuitement.

Demander une estimation