Vol. 3 — № 03
The Go Loop · KiosqueNewsstand
Blog  
Un atelier Go · Édition d'ApprentissageA Go Workshop · Learning Edition

La valeur derrière l'interface The value behind the interface

Une interface, c'est une paire (type, valeur). L'assertion x.(T) et le type switch la rouvrent ; le boxing et l'indirection la paient. Quand any sauve la mise, et quand il faut s'en passer. An interface is a (type, value) pair. The x.(T) assertion and the type switch reopen it; boxing and indirection pay for it. When any saves the day, and when to do without it.

AudienceAudience
Dev qui manipule des any et des type switch et veut en connaître le coût et les alternatives Dev handling any and type switches who wants to know their cost and alternatives
Format
Self-paced
ChapitresChapters
5
Date
Fév 2027 Feb 2027
≈ 17 min ●●●○ InterfacesType assertionCoût

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

L'interface a emballé une valeur. L'assertion la rouvre.The interface wrapped a value. The assertion reopens it.

Deux numéros durant, la paire (type, valeur) nous a servis ou trahis sans qu'on y touche. On va maintenant l'ouvrir nous-mêmes. L'assertion de type, x.(T), prend une interface et en extrait le type concret qu'elle transporte — elle fait le chemin inverse de l'emballage. Le hic, c'est qu'on affirme un type : si l'interface n'en contient pas, l'assertion nue panique. D'où la forme à deux retours, v, ok := x.(T), qui ne panique jamais : elle pose une question au lieu d'asséner une certitude. C'est la version sûre, et la seule qu'on devrait écrire par défaut.For two issues, the (type, value) pair served or betrayed us without our touching it. Now we'll open it ourselves. The type assertion, x.(T), takes an interface and extracts the concrete type it carries — it walks the wrapping backwards. The catch is that you assert a type: if the interface holds another, the bare assertion panics. Hence the two-result form, v, ok := x.(T), which never panics: it asks a question instead of stating a certainty. It's the safe version, and the only one you should write by default.

L'assertion nue : aie raison, ou paniqueThe bare assertion: be right, or panic
var i any = "hello"           // la paire : (string, "hello")

s := i.(string)               // "hello" — on ressort le type concret
n := i.(int)                  // panic: interface conversion:
                              //        string is not int
// l'assertion nue exige d'avoir RAISON sur le type — sinon, panic.
La forme à deux retours : une question, pas un pariThe two-result form: a question, not a bet
s, ok := i.(string)           // "hello", true
n, ok := i.(int)              // 0, false  — pas de panic, ok dit l'échec
if ok {
    use(n)                    // on n'entre QUE si le type colle
}
// la forme à deux retours transforme une erreur fatale en branche.
Emballer, puis rouvrirWrap, then reopen
42
int concret
i = x
boxing
(int, 42)
any
i.(int)
assertion
42
int concret

Ranger un int dans une any remplit la paire ; l'assertion i.(int) la vide à nouveau dans un int concret. L'assertion n'est pas une conversion — elle ne transforme rien : elle vérifie que le type rangé est bien celui qu'on demande, et rend la valeur telle quelle.Storing an int in an any fills the pair; the assertion i.(int) empties it back into a concrete int. The assertion isn't a conversion — it transforms nothing: it checks the stored type is the one you ask for, and returns the value as is.

Le réflexe du numéroThe issue's reflex

« Une interface, on ne la rouvre qu'avec le ok. » L'assertion nue est un pari sur le type ; perdu, il panique. La forme à deux retours en fait une branche. Tout le numéro déroule ce qu'on peut faire de la paire rouverte — router selon le type, en payer le coût — et quand il vaut mieux ne jamais l'avoir emballée."You reopen an interface only with the ok." The bare assertion is a bet on the type; lost, it panics. The two-result form turns it into a branch. The whole issue unrolls what you can do with the reopened pair — route on type, pay its cost — and when you'd have been better off never wrapping it.

Asserter une interface, pas qu'un type concret.Asserting to an interface, not only a concrete type.

T dans x.(T) n'est pas forcément un type concret : ça peut être une autre interface. x.(io.Reader) demande « la valeur cachée sait-elle Read ? » et, si oui, te rend une vue io.Reader dessus. C'est le mécanisme derrière des idiomes comme err.(interface{ Temporary() bool }) : on teste à l'exécution si la valeur satisfait un comportement, sans connaître son type. La paire ne rend pas que du concret — elle rend l'angle de vue qu'on lui demande, du moment qu'il est compatible.T in x.(T) needn't be a concrete type: it can be another interface. x.(io.Reader) asks 'does the hidden value know how to Read?' and, if so, hands you an io.Reader view of it. It's the mechanism behind idioms like err.(interface{ Temporary() bool }): you test at runtime whether the value satisfies a behaviour, without knowing its type. The pair returns not only concretes — it returns the angle you ask for, as long as it's compatible.

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Go Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Go Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand