Les bases du langage Go et Hugo!

Les bases du langage Go et Hugo!

Tags : Cours, Développement, Golang, Google, Navigateur, Open-source, Tutoriaux, Tutoriel
Catégorie : Programmation
Mise en ligne : 18 Décembre 2018 à 13:45

Si vous cherchez un langage simple et rapide mais aussi un système de bloging, vous êtes au bon endroit. Aujourd'hui je vais vous apprendre les bases du langage Go (ou Golang) et du framework Hugo.

Je pars du principe que Go et Hugo sont déjà installés sur votre machine. Si ce n'est pas le cas, un rapide tour sur les sites officiels vous donneront la marche à suivre en fonction de votre OS.

Go (ou Golang), c'est quoi ?

Le langage Go (ou Golang) a été lancée en 2009 par Google. C'est un langage compilé et inspiré du C. Il permet une scalabilité (possibilité de lancer plusieurs tâches en parallèle) grâce aux goroutine.

Lorsque vous allez devoir installer des nouveaux paquets (autres que les paquets officiels), vous allez passer principalement par git.

Projets utilisant Go

Le langage est assez répandu de par sa grande légèreté d'exécution et aussi le fait qu'il soit cross-platform (possibilité d'être exécuté sur Windows, Mac ou Linux) :

Un peu de code

Rentrons dans le vif du sujet avec un peu de programmation histoire de se familiariser avec le langage.

Typage

Integer

Pour définir un entier il existe plusieurs notations : int, int8, int16, int32, int64 ou uint, uint8, uint16, uint32, uint64

La différence entre un entier int et int8 (ou les autres), réside dans le fait que le langage va déduire lui-même la meilleure notation à utiliser. Le souci c'est qu'il peut très bien prendre une valeur qui serait bien trop grande ou pas du tout adaptée. C'est donc un souci pour les perfs car il va encombrer la mémoire pour rien.

Un uint est un entier unsigned, c'est-à-dire qui ne va pas en dessous de 0.

Prenons par exemple un système de notation pour les contrôles des élèves. Nous allons noter les élèves de 0 à 20. Si nous écrivons :

var note int = 12

Il va peut-être prendre un entier int8 voir pire int64. Pour de meilleures performances il serait donc plus intélligent d'utiliser uint8 qui va de 0 à 127.

Niveau notation, vous allez pouvoir en trouver plusieurs sur Internet :

  • var a int8 = 12 : tien compte des perfs
  • var a = 12 : laisse le choix à Go de prendre la meilleur valeur
  • a := 12 : item pour celle-ci
Float

Pour les nombres à virgules, ou float, la notation est presque pareil float32 ou float64. Bizarrement il n'est pas possible de définir un float non signé.

Boolean

Pour les boolean (true ou false), rien de bien compliqué bool.

String

Idem pour les chaînes de caractères string

Boucles

Dans votre code, vous allez forcément être amené à parcourir des objets ou autres. Il est donc important de savoir comment faire

For
for i:=0; i<10; i++ {
    // Do your stuff
}
Foreach
x := [5]int{1,2,3,4,5}

for key, value := range x {
    // Do your stuff
}

Dans les foreach, il est possible de ne récupérer que les valeurs. En effet les clés ne sont pas obligatoires. Et si jamais vous récupérez les clés mais que vous ne vous en servez pas, Go va lever directement une erreur. Car oui une variable non utilisée, c'est de la mémoire prise pour rien et donc pas bon pour les perfs.

While
i := 0
for i<10 {
    // Do your stuff
    i++
}

Conditions

Dans votre code vous allez aussi devoir faire des tests, pour aller dans tel ou tel cas.

If
if (condition) {
    // Do your stuff
} else if (condition2) {
    // Do your stuff
} else {
    // Do your stuff
}
Switch
switch x {
case 0:
    // Do your stuff
default:
    // Do your stuff
}

Dans les switch/case, plutôt que de tester une valeur précise, si on ne passe rien en paramètre, il est possible de faire des avec des boolean.

switch {
case x == 0:
    // Do your stuff
case x > 0:
    // Do your stuff
}

Et vous remarquerez que contrairement au PHP (par exemple), quand il rentre dans un case, une fois l'instruction terminée, il n'est pas nécessaire de faire un break. Il sort de lui-même et ne rentrera pas dans les autres cas.

Hello World!

Nous allons maintenant créer un petit Hello world!

nano hello.go
package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(hello("Jérémy"))
}

func hello(name string) string {
    return "Hello " + strings.ToUpper(name)
}
go run hello.go

Hugo

Maintenant que nous avons les bases du langage, il est intéressant de regarder le CMS/framework web Hugo qui est programmé en Go.

Comme Jekyll (développé en Ruby), Hugo est un générateur de site statique. C'est-à-dire qu'il n'a pas besoin de base de données ou autre pour fonctionner. C'est un peu comme on faisait des sites Internet au début avec uniquement du HTML et du CSS.

Les pages sont donc générées lors de la création ou à la modification d'un contenu. L'avantage, c'est qu'il fonctionne sans dépendances. Pas comme Ruby, Python ou PHP.

Site utilisant Hugo

Hugo est assez répandu et utilisé pour sa mise en place rapide, sa rapidité d'exécution et sa souplesse. Entre autres il y a comme site :

  • Github Pages
  • Amazon S3
  • Azure
  • Let's Encrypt

Avantages

Les gros avantages, c'est que le build de vos pages se fait très rapidement (< 1ms), comme c'est du Go, il est multi-platforme et il possède un système de live reload. C'est-à-dire que lors de la modification d'un contenu, il va détecter ce qui est modifié et rebuilder instantanément le contenu, même pour ceux qui auraient déjà la page en cours de lecture.

Templating

Si vous souhaitez créer votre propre thème ou même développer des fonctionnalités, il vous faudra maîtriser le moteur de template. Ici c'est un dérivé du Jinja (utilisé par Python). Si vous connaissez Twig, la syntaxe doit vous paraître familière car lui aussi est un dérivé du Jinja.

  • Afficher une variable: {{ .Title }} ou {{ $my_var }}
  • Exécuter une fonction: {{ seq 1 5 }} ou {{ (seq 1 5) | shuffle }}
  • Conditions {{ if CONDITION }} stuff {{ end }}
  • Inclusions {{ partial "<PATH>/<PARTIAL>.<EXTENSION>" . }} ou {{ partialCached "<PATH>/<PARTIAL>.<EXTENSION>" . }}

Notez bien le . à la fin des méthodes qui permettent l'inclusion d'une template ou lors de l'affichage d'une variable. Ce point permet de passer le contexte qui est utilisé.

La fonction seq permet de créer une séquence d'entiers. seq 1 5 donne 1,2,3,4,5

L'un des autres avantages, c'est qu'il intègre nativement un compilateur SASS/SCSS

{{ $style := resources.Get "sass/main.scss" | resources.toCSS }}
<link rel="stylesheet" href="{{ $style.Permalink }}">

Mais aussi un minifieur CSS, JS, JSON, HTML, SVG et XML

{{ $css := resources.Get "css/main.css" }}
{{ $style := $css | resources.Minify }}

Et un asset building

{{ $plugins := resources.Get "js/plugins.js" }}
{{ $global := resources.Get "js/global.js" }}
{{ $js := slice $plugins $global | resources.Concat "js/bundle.js" }}

Création d'un blog

Si vous souhaitez avoir un blog sans vous casser la tête, Hugo est un système très performant. Pour installer des thèmes ou des plugins, il faudra passer par les submodules de git, c'est pour cela qu'il faut initialiser git à la création de votre projet.

Ici nous allons créer un blog avec le thème bleak. Et comme l'édition des pages sur Hugo se fait via un fichier markdown, il nous faudra copier la template de base du thème pour avoir accès à toutes les fonctionnalités.

hugo new site blog
cd blog
git init
git submodule add https://github.com/Zenithar/hugo-theme-bleak.git themes/bleak
echo 'theme = "bleak"' >> config.toml
cp themes/bleak/archetypes/default.md archetypes/default.md
hugo server

Lors du lancement de notre serveur via la commande hugo server, il est possible de lui passer comme paramètre -D ou --buildDrafts. Cela permet de lui dire d'inclure les contenus qui sont marqués comme brouillon ou draft.

Création d'un article

Pour créer un article, rien de bien compliqué :

hugo new posts/my-first-content.md
nano content/posts/my-first-content.md

Voilà, vous avez un blog tout à fait fonctionnel. Il est possible de l'uploader sur github et bénéficier des github pages si vous ne voulez pas vous embêter à installer un serveur avec Go.

Démo

Source

<Laisser un commentaire/>

* Champs obligatoire