le langage go 1 ère partie

76
Le langage Go 1 ère partie Rob Pike [email protected] Traduction en français xavier.mehaut @ gmail.com (Version de Juin 2011)

Upload: karli

Post on 23-Feb-2016

98 views

Category:

Documents


1 download

DESCRIPTION

Le langage Go 1 ère partie. Rob Pike [email protected] Traduction en français xavier.mehaut @ gmail.com (Version de Juin 2011). Qui?. Travail effectué par une petite équipe chez Google, plus beaucoup de contributeurs du monde entier . Contact : - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Le langage   Go  1 ère  partie

Le langage Go

1egravere partie

Rob Pikergooglecom

Traduction en franccedilaisxaviermehaut gmailcom

(Version de Juin 2011)

Qui

Travail effectueacute par une petite eacutequipe chez Google plus beaucoup de contributeurs du monde entier

Contactndash httpgolangorg web sitendash golang-nutsgolangorg user discussionndash golang-devgolangorg developers

Plan du cours1ere jourbull Les bases

2egraveme jourbull Types meacutethodes et interfaces

3egraveme jourbull Concurrence and communication

Ce cours se focalise sur la programmation en GO et non pas sur la genegravese et conception du langage lui-mecircme

Aperccedilu du cours drsquoaujourdrsquohui

bull Motivationsbull Les basesndash Du simple et du familier

bull Les laquo packages raquo et la construction drsquoun programme

Motivations

Pourquoi un nouveau langage

Dans le monde qui est le nocirctre les langages actuels ne nous aident pas suffisamment ndash Les ordinateurs sont rapides mais deacutevelopper un logiciel est

lentndash Une analyse de deacutependance est neacutecessaire pour la rapiditeacute et

la sucircreteacute de fonctionnement ndash Typage trop verbeux ndash Le ramasse-miettes et la concurrence sont trop pauvrement

pris en charge ndash Les multi-coeurs sont consideacutereacutes comme des sources d

eproblegraveme et non des opportuniteacutes

Pour positiver

Notre but est rendre la programmation de nouveau funndash Le feeling drsquoun langage drsquoun dynamique avec la sucircreteacute de

fonctionnement drsquoun systegraveme typeacute statiquement ndash Compiler en langage machine pour une exeacutecution rapide ndash Run-time temps reacuteel qui supporte un ramasse-miettes et

la concurrencendash Leacuteger systegraveme de type flexiblendash Possegravede des meacutethodes comme un langage objet mais pas

de maniegravere conventionnelle

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 2: Le langage   Go  1 ère  partie

Qui

Travail effectueacute par une petite eacutequipe chez Google plus beaucoup de contributeurs du monde entier

Contactndash httpgolangorg web sitendash golang-nutsgolangorg user discussionndash golang-devgolangorg developers

Plan du cours1ere jourbull Les bases

2egraveme jourbull Types meacutethodes et interfaces

3egraveme jourbull Concurrence and communication

Ce cours se focalise sur la programmation en GO et non pas sur la genegravese et conception du langage lui-mecircme

Aperccedilu du cours drsquoaujourdrsquohui

bull Motivationsbull Les basesndash Du simple et du familier

bull Les laquo packages raquo et la construction drsquoun programme

Motivations

Pourquoi un nouveau langage

Dans le monde qui est le nocirctre les langages actuels ne nous aident pas suffisamment ndash Les ordinateurs sont rapides mais deacutevelopper un logiciel est

lentndash Une analyse de deacutependance est neacutecessaire pour la rapiditeacute et

la sucircreteacute de fonctionnement ndash Typage trop verbeux ndash Le ramasse-miettes et la concurrence sont trop pauvrement

pris en charge ndash Les multi-coeurs sont consideacutereacutes comme des sources d

eproblegraveme et non des opportuniteacutes

Pour positiver

Notre but est rendre la programmation de nouveau funndash Le feeling drsquoun langage drsquoun dynamique avec la sucircreteacute de

fonctionnement drsquoun systegraveme typeacute statiquement ndash Compiler en langage machine pour une exeacutecution rapide ndash Run-time temps reacuteel qui supporte un ramasse-miettes et

la concurrencendash Leacuteger systegraveme de type flexiblendash Possegravede des meacutethodes comme un langage objet mais pas

de maniegravere conventionnelle

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 3: Le langage   Go  1 ère  partie

Plan du cours1ere jourbull Les bases

2egraveme jourbull Types meacutethodes et interfaces

3egraveme jourbull Concurrence and communication

Ce cours se focalise sur la programmation en GO et non pas sur la genegravese et conception du langage lui-mecircme

Aperccedilu du cours drsquoaujourdrsquohui

bull Motivationsbull Les basesndash Du simple et du familier

bull Les laquo packages raquo et la construction drsquoun programme

Motivations

Pourquoi un nouveau langage

Dans le monde qui est le nocirctre les langages actuels ne nous aident pas suffisamment ndash Les ordinateurs sont rapides mais deacutevelopper un logiciel est

lentndash Une analyse de deacutependance est neacutecessaire pour la rapiditeacute et

la sucircreteacute de fonctionnement ndash Typage trop verbeux ndash Le ramasse-miettes et la concurrence sont trop pauvrement

pris en charge ndash Les multi-coeurs sont consideacutereacutes comme des sources d

eproblegraveme et non des opportuniteacutes

Pour positiver

Notre but est rendre la programmation de nouveau funndash Le feeling drsquoun langage drsquoun dynamique avec la sucircreteacute de

fonctionnement drsquoun systegraveme typeacute statiquement ndash Compiler en langage machine pour une exeacutecution rapide ndash Run-time temps reacuteel qui supporte un ramasse-miettes et

la concurrencendash Leacuteger systegraveme de type flexiblendash Possegravede des meacutethodes comme un langage objet mais pas

de maniegravere conventionnelle

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 4: Le langage   Go  1 ère  partie

Aperccedilu du cours drsquoaujourdrsquohui

bull Motivationsbull Les basesndash Du simple et du familier

bull Les laquo packages raquo et la construction drsquoun programme

Motivations

Pourquoi un nouveau langage

Dans le monde qui est le nocirctre les langages actuels ne nous aident pas suffisamment ndash Les ordinateurs sont rapides mais deacutevelopper un logiciel est

lentndash Une analyse de deacutependance est neacutecessaire pour la rapiditeacute et

la sucircreteacute de fonctionnement ndash Typage trop verbeux ndash Le ramasse-miettes et la concurrence sont trop pauvrement

pris en charge ndash Les multi-coeurs sont consideacutereacutes comme des sources d

eproblegraveme et non des opportuniteacutes

Pour positiver

Notre but est rendre la programmation de nouveau funndash Le feeling drsquoun langage drsquoun dynamique avec la sucircreteacute de

fonctionnement drsquoun systegraveme typeacute statiquement ndash Compiler en langage machine pour une exeacutecution rapide ndash Run-time temps reacuteel qui supporte un ramasse-miettes et

la concurrencendash Leacuteger systegraveme de type flexiblendash Possegravede des meacutethodes comme un langage objet mais pas

de maniegravere conventionnelle

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 5: Le langage   Go  1 ère  partie

Motivations

Pourquoi un nouveau langage

Dans le monde qui est le nocirctre les langages actuels ne nous aident pas suffisamment ndash Les ordinateurs sont rapides mais deacutevelopper un logiciel est

lentndash Une analyse de deacutependance est neacutecessaire pour la rapiditeacute et

la sucircreteacute de fonctionnement ndash Typage trop verbeux ndash Le ramasse-miettes et la concurrence sont trop pauvrement

pris en charge ndash Les multi-coeurs sont consideacutereacutes comme des sources d

eproblegraveme et non des opportuniteacutes

Pour positiver

Notre but est rendre la programmation de nouveau funndash Le feeling drsquoun langage drsquoun dynamique avec la sucircreteacute de

fonctionnement drsquoun systegraveme typeacute statiquement ndash Compiler en langage machine pour une exeacutecution rapide ndash Run-time temps reacuteel qui supporte un ramasse-miettes et

la concurrencendash Leacuteger systegraveme de type flexiblendash Possegravede des meacutethodes comme un langage objet mais pas

de maniegravere conventionnelle

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 6: Le langage   Go  1 ère  partie

Pourquoi un nouveau langage

Dans le monde qui est le nocirctre les langages actuels ne nous aident pas suffisamment ndash Les ordinateurs sont rapides mais deacutevelopper un logiciel est

lentndash Une analyse de deacutependance est neacutecessaire pour la rapiditeacute et

la sucircreteacute de fonctionnement ndash Typage trop verbeux ndash Le ramasse-miettes et la concurrence sont trop pauvrement

pris en charge ndash Les multi-coeurs sont consideacutereacutes comme des sources d

eproblegraveme et non des opportuniteacutes

Pour positiver

Notre but est rendre la programmation de nouveau funndash Le feeling drsquoun langage drsquoun dynamique avec la sucircreteacute de

fonctionnement drsquoun systegraveme typeacute statiquement ndash Compiler en langage machine pour une exeacutecution rapide ndash Run-time temps reacuteel qui supporte un ramasse-miettes et

la concurrencendash Leacuteger systegraveme de type flexiblendash Possegravede des meacutethodes comme un langage objet mais pas

de maniegravere conventionnelle

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 7: Le langage   Go  1 ère  partie

Pour positiver

Notre but est rendre la programmation de nouveau funndash Le feeling drsquoun langage drsquoun dynamique avec la sucircreteacute de

fonctionnement drsquoun systegraveme typeacute statiquement ndash Compiler en langage machine pour une exeacutecution rapide ndash Run-time temps reacuteel qui supporte un ramasse-miettes et

la concurrencendash Leacuteger systegraveme de type flexiblendash Possegravede des meacutethodes comme un langage objet mais pas

de maniegravere conventionnelle

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 8: Le langage   Go  1 ère  partie

Ressources Pour plus drsquoinformation voir la documentation sur le site

ndash httpgolangorg

Inclusndash Speacutecification du langage ndash tutorielndash laquo Effective Go raquo ndash documentation des bibliothegraveques de code ndash Deacutemarrage et laquo how-toraquo sndash FAQsndash Bac agrave sable (exeacutecuter Go agrave partir drsquoun navigateur)ndash Etchellip

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 9: Le langage   Go  1 ère  partie

Status compilateursgc (Ken Thompson) aka 6g 8g 5g

ndash Deacuteriveacute du modegravele de compilation de Plan9ndash Geacutenegravere du code OK tregraves rapidement ndash Pas directement linkable avec gcc

gccgo (Ian Taylor)ndash Architecture plus familegravere ndash Geacuten-re un bon code mais pas aussi rapide ndash Linkable avec gcc

Disponible pour les architectures 32-bit 64-bits x86 (amd64x86-64) et ARM

Ramasse-miettes concurrence etc impleacutementeacutesBibliothegraveques de bonne qualiteacute et ameacutelioreacutees

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 10: Le langage   Go  1 ère  partie

Les bases

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 11: Le langage   Go  1 ère  partie

Codons

package main

import fmt

func main() fmtPrint(Hello bonjour n)

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 12: Le langage   Go  1 ère  partie

Bases du langage

En preacute-supposant votre familiariteacute avec des langage de type C nous allons brosser un rapide aperccedilu des bases du langage

Ce sera facile familier et sans doute reacutebarbatif Toutes mes excuses pour cela

Les deux prochaines parties contiennent plus de matiegravere agrave amusement mais nous devons poser les bases en premier lieu

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 13: Le langage   Go  1 ère  partie

Structure lexicaleTraditionnel avec quelques deacutetails plus modernes

Le code source est UTF-8

Espaces muets espace tabulation nouvelle ligne retour charriot

Les identificateurs sont des lettres et des nombres (plus _) avec with ldquolettre et ldquonombre deacutefinis par Unicode

Commentaires Ceci est un commentaire pas drsquoimbrication En voilagrave un autre

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 14: Le langage   Go  1 ère  partie

LiteacuterauxSimilaire au C mais les nombres requiegraverent aucun signe ni marque de taille

230x0FF1234e7

Similaire au C mais UnicodeUTF-8 Egalement xNN toujours 2 digits 012 toujours 3 les deux sont des octetsHello worldnxFF 1 octetu00FF 1 caractegravere Unicode 2 octets de UTF-8

Chaicircnes de caractegraveres`nabct` == nabct

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 15: Le langage   Go  1 ère  partie

Aperccedilu de la syntaxePrincipalement similaire au C avec des types et deacuteclarations renverseacutes

plus des mots clefs pour introduire le type de deacuteclarationvar a intvar b c int notez la difference avec le Cvar d []inttype S struct a b int

Les structures de controcircles sont familiegraveres if a == b return true else return false for i = 0 i lt 10 i++

Note pas de parenthegraveses mais des accolades requises

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 16: Le langage   Go  1 ère  partie

Point virguleLes points virgule terminent les deacuteclarations mais

ndash lexer les insert automatiquement agrave la fin drsquoune ligne si le token preacuteceacutedent la fin de ligne est une fin de regravegle grammaticale

ndash Note bien plus propre et simple que les regravegles javascript

Ainsi aucun point virgule nrsquoest neacutecessaire dans ce programme package mainconst three = 3var i int = threefunc main() fmtPrintf(dn i)

En pratique un code en Go ne possegravede quasiment aucun point virgure en dehors des clauses fo et if

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 17: Le langage   Go  1 ère  partie

Les types numeacuteriquesNumeric types are built in will be familiar

Auquels on peut ajouter uintptr un entier suffisamment grand pour stocker un pointeur

Ce sont tous des types distincts int nrsquoest pas pas un int32 mecircme sur une machine 32 bits

Pas de conversion implicite (mais ne paniquez pas )

INT UINT

INT8 UINT8=BYTE

INT16 UNINT16

INT32 UNINT32 FLOAT32 COMPLEX64

INT64 UNINT64 FLOAT64 COMPLEX128

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 18: Le langage   Go  1 ère  partie

Bool

Le type booleacuteen usuel bool avec comme valeurs uniques true et false (constantes preacutedeacutefinies)

La deacuteclaration if utilise des expressions booleacuteennes

Les pointeurs et les entiers ne sont pas des booleacuteens

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 19: Le langage   Go  1 ère  partie

StringLe type natif string repreacutesente un tableau drsquooctets immutable crsquoest agrave

dire du texte Les chaicircnes de caractegraveres sont de taille deacutelimiteacutee non nulles

Les chaicircnes de caractegraveres litteacuterales sont de type string

Immutable tout comme les ints On peut reacuteaffecterdes variables mais pas eacutediter leur contenu

Comme 3 est toujours 3 ldquobonjourrdquo reste ldquobonjourrdquo

Le langage Go possegravede un bon support de manipulation de chaicircnes

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 20: Le langage   Go  1 ère  partie

Expressions

Ordre de preacuteceacutedence Opeacuterateurs Commentaires5 ltlt gtgt amp amp^ amp^ est laquo bit clear raquo

4 + - | ^ ^ est laquo xor raquo

3 == = lt lt= gt gt=

2 ampamp

1 ||

Globalement comme les opeacuterateurs C

Les opeacuterateurs qui sont eacutegalement unaires amp + - ^ (plus lt- pour les communications)

Lrsquoopeacuterateur unaire ^ est compleacutement

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 21: Le langage   Go  1 ère  partie

Expressions Go vs Expressions CSurprenant pour le deacuteveloppeur C

Moins de niveaux de preacuteceacutedence (devrait ecirctre simple)^ agrave la place de ~ (crsquoest le ou exclusif binaire fait unaire)++ et ndash ne sont pas des opeacuterateurs expression(x++ est une deacuteclaration pas une expressionp++ est (p)++ pas(p++))amp^ est nouveau pratique dans les expressions constantesltlt gtgt etc requiert un entier non signeacute de deacutecalage

Non surprenantLes opeacuterateurs drsquoaffectation fonctionnent comme preacutevus += ltlt= amp^= etcLes expressions ressemblent geacuteneacuteralement agrave celles en C (indexationAppel de fonctions etc)

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 22: Le langage   Go  1 ère  partie

Exemples+x23 + 3x[i]x lt= f()^a gtgt bf() || g()x == y + 1 ampamp lt-ch gt 0x amp^ 7 x avec les 3 bits de poids faible videacutesfmtPrintf(52gn 2mathSin(PI8))7234x + 23i

hello + world concatenation pas comme en C a b

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 23: Le langage   Go  1 ère  partie

Conversions numeacuteriquesConvertir une valeur numeacuterique drsquoun type agrave un autre est une conversion avec une syntaxe

similaire agrave un appel de fonction

uint8(intVar) tronque agrave la taille du type reacutecepteurint(float64Var) tronque la fractionfloat64(intVar) convertit en float64

Il existe eacutegalement des conversion de ou vers string

string(0x1234) == u1234string(sliceOfBytes) octets -gt octetsstring(sliceOfInts) ints -gt UnicodeUTF-8[]byte(abc) octets -gt octets[]int(105186010518601051860) UnicodeUTF-8 -gt ints

(Les slices sont lieacutees aux tableaux vus plus tard)

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 24: Le langage   Go  1 ère  partie

ConstantesLes constantes numeacuteriques sont des ldquonombres ideacuteauxrdquo pas de taille ni de signe

et mecircme plus pas de terminaison en L ou U ou UL

077 octal0xFEEDBEEEEEEEEEEEEEEEEEEEEF hexadeacutecimal1 ltlt 100

Il existe eacutegalement des nombres flottants ou entiers ideacuteauxLa syntaxe des liteacuteraux deacutetermine le type

1234e5 point flottant1e2 point flottant32i point flottant imaginaire (nombre complexe)100 entier

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 25: Le langage   Go  1 ère  partie

Expressions constantesLes constantes agrave point flottant et entiegraveres peuvent ecirctre combineacutees agrave volonteacute avec

comme type reacutesultant deacutetermineacute par le types de constantes utiliseacutees

Les opeacuterations elles-mecircmes deacutependent du type

2314 point flottant 62832 point flottant 1532 entier 13+2i complexe 30+20i haute preacutecisionconst Ln2 = 069314718055994530941723212145817656807const Log2E = 1Ln2 reacuteciproque preacutecis

La repreacutesentation est ldquoassez grande (1024 bits pour le moment)

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 26: Le langage   Go  1 ère  partie

Conseacutequence des nombre ideacuteauxLe langage permet lrsquoutilisation de constantes sans conversion explicite si la valeur peut

ecirctre converti dans le type reacuteceptacle(il nrsquoy a pas de conversion neacutecessaire la valeur est OK)

var million int = 1e6 la syntaxe flottante est OKmathSin(1)

Les constantes doivent ecirctre convertibles dans leur typeExample ^0 est -1 qui nrsquoest pas dans lrsquointervalle 0-255

uint8(^0) faux -1 ne peut ecirctre converti en entier non signeacute^uint8(0) OKuint8(350) faux 350 ne peut ecirctre converti en entieruint8(350) OK 35uint8(35) faux 35 ne peut ecirctre converti en entier

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 27: Le langage   Go  1 ère  partie

DeacuteclarationsLes deacuteclarations sont introduites par un mot clef (varconst type func) et sont

inverseacutees si on compare au C var i intconst PI = 227type Point struct x y int func sum(a b int) int return a + b

Pourquoi sont elles inverseacutees Exemple preacuteceacutedentvar p q int

Peut ecirctre lu ainsi Les variables p et q sont des pointeurs sur entier

Plus clair non Presque du langage naturelUne autre raison sera vue ulteacuterieurement

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 28: Le langage   Go  1 ère  partie

VarLes deacuteclarations de variable sont introduites par le mot clef var

Elles peuvent contenir un type ou une expression drsquoinitialisation typante lrsquoun ou lrsquoautre obligatoire

var i intvar j = 365245var k int = 0var l m uint64 = 1 2var nanoseconds int64 = 1e9 constante float64var inter floater stringer = 1 20 hi

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 29: Le langage   Go  1 ère  partie

Var distribueacuteIl est peacutenible de taper var tout le temps Nous pouvons regrouper

toutes les variables de la faccedilon suivante

var (i intj = 356245k int = 0l m uint64 = 1 2nanoseconds int64 = 1e9inter floater stringer = 1 20 hi

)

Cette regravegle srsquoapplique aux const type var mais pas agrave func

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 30: Le langage   Go  1 ère  partie

La laquo deacuteclaration courte raquo = Dans le corps des fonctions (seulement) les deacuteclarations de la forme

var v = valuepeuvent ecirctre raccourcis en

v = value(une autre raison pour lrsquoinversion nametype vue preacuteceacutedemment par

rapport au C)

Le type est ce que la valeur est (pour les nombres ideacuteaux on a int float64 et complex128 respectivement)a b c d e = 1 20 three FOUR 5e0i

Ce type de deacuteclaration est beaucoup utiliseacute et sont disponibles dans des endroits comme des initialiseurs de boucles

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 31: Le langage   Go  1 ère  partie

Les constantes Les constantes sont deacuteclareacutees par le mot clef const

Elles doivent avoir une ldquoexpression constanterdquo eacutevalueacutee agrave la compilation comme initialiseur et peuvent ecirctre typeacutees de maniegravere optionnelle

const Pi = 227const AccuratePi float64 = 355113const beef two parsnip = meat 2 vegldquo

const (Monday Tuesday Wednesday = 1 2 3Thursday Friday Saturday = 4 5 6

)

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 32: Le langage   Go  1 ère  partie

IotaLes constantes peuvent utiliser le compteur iota qui deacutemarre agrave 0 dans chaque bloc et qui srsquoincreacutemente agrave chaque point virgule implicite (fin de ligne)

const (Monday = iota 0Tuesday = iota 1

)

Raccorcis les types et lrsquoexpressions preacuteceacutedents peuvent ecirctre reacutepeacuteteacutesconst (

loc0 bit0 uint32 = iota 1ltltiota 0 1loc1 bit1 1 2loc2 bit2 2 4

)

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 33: Le langage   Go  1 ère  partie

TypesLes types sont introduits par le mot clef type

Nous reviendrons plus preacuteciseacutement sur les types plus tard mais voici tout de mecircme quelques exemples

type Point struct x y z float64name string

type Operator func(a b int) inttype SliceOfIntPointers []int

Nous reviendrons sur les fonctions eacutegalement un peu plus tard

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 34: Le langage   Go  1 ère  partie

NewLa fonction native new alloue de la meacutemoire La syntaxe est similaire agrave celle drsquoune fonction avec des types comme arguments similaires au c++ Retourne un pointeur sur un objet alloueacute

var p Point = new(Point)v = new(int) v a le type int

Nous verrons plus tard comment construire des slices et autres

Il nrsquoy a pas de delete ni de free Go possegravede un ramasse-miettes

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 35: Le langage   Go  1 ère  partie

Affectations

Lrsquoaffectation est simple et familiegravere a = b

Mais les affectations multiples fonctionnent aussi

x y z = f1() f2() f3()a b = b a swap

Les fonctions peuvent retourner des valeurs multiples nbytes error = Write(buf)

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 36: Le langage   Go  1 ère  partie

Les structures de controcircles

Similaire au C mais diffeacuterents sur certains points

Go possegravede des if for et switch (plus un de plus que nous verrons plus tard)

Comme indiqueacute preacuteceacutedemment pas de parenthegraveses ni accolades obligatoires

Les if for et switch acceptent tous des deacuteclarations drsquoinitialisation

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 37: Le langage   Go  1 ère  partie

Forme des structures de controcircle

Les deacuteclarations if et switch seront deacutecrites dans les slides suivants Ils peuvent avoir une ou deux expressions

La boucle for peut posseacuteder une ou trois expressions un seule eacuteleacutement correspond au while du C

for a trois eacutelements correspond au for du C

for abc

Dans aucune de ces formes un eacutelement ne peut ecirctre vide

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 38: Le langage   Go  1 ère  partie

IfLa forme de base est familiegravere Basic form is familiar

if x lt 5 less() if x lt 5 less() else if x == 5 equal()

Lrsquoinitialisation drsquoune deacuteclaration est autoriseacutee requiert un point virguleif v = f() v lt 10 fmtPrintf(d less than 10n v)

else fmtPrintf(d not less than 10n v)

Utile avec des fonctions agrave multivariables if n err = fdWrite(buf) err = nil

Des conditions manquantes signifient true ce qui nrsquoest pas tregraves utile dans ce contexte mais utile dans les for et switch

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 39: Le langage   Go  1 ère  partie

ForLa forme de base est familiegravere for i = 0 i lt 10 i++

La condition manquante signifie true for fmtPrintf(looping forever)

Mais vous pouvez eacuteliminer les points virgule eacutegalementfor fmtPrintf(Mine )

Ne pas oublier les affectations multi-variables for ij = 0N i lt j ij = i+1j-1

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 40: Le langage   Go  1 ère  partie

SwitchLes switchs sont globalement similaires agrave ceux du C

Mais il existe des diffeacuterences syntaxiques et seacutemantiques - les expressions nrsquoont pas besoin drsquoecirctre constantes ou bien entiegraveres- pas drsquoeacutechappement automatique- agrave la place la derniegravere deacuteclaration peut ecirctre fallthrough- les cas multiples peuvent ecirctre seacutepareacutes par des virgules

switch count7 case 456 error()case 3 a = v fallthroughcase 2 a = v fallthroughcase 1 a = v fallthroughcase 0 return av

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 41: Le langage   Go  1 ère  partie

Switch (2)Les switchs en Go sont bien plus performants qursquoen C La forme familiegravere

switch a case 0 fmtPrintf(0)default fmtPrintf(non-zero)

Les expressions peuvent ecirctre de nrsquoimporte quel type et une expression manquante signifie true Reacutesultat la chaicircne if-else avec un switch donne

a b = x[i] y[j]switch

case a lt b return -1case a == b return 0case a gt b return 1

orswitch a b = x[i] y[j]

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 42: Le langage   Go  1 ère  partie

Break continue etchellipLes deacuteclarations break et continue fonctionnent comme en C

On peut eacutegalement speacutecifier un label pour sortir de la structure de controcircle

Loop for i = 0 i lt 10 i++ switch f(i) case 0 1 2 break Loopg(i)

Oui Ken (Thomson) il y a un goto

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 43: Le langage   Go  1 ère  partie

FonctionsLes fonctions sont introduites par le mot clef funcLe type de retour srsquoil y en a vient apregraves les paramegravetres dans la deacuteclaration Le return se comporte comme vous lrsquoattendez

func square(f float64) float64 return ff

Une fonction peut retourner des valeurs multiples Si crsquoest le cas les types de retour sont entre parenthegraveses

func MySqrt(f float64) (float64 bool) if f gt= 0 return mathSqrt(f) true return 0 false

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 44: Le langage   Go  1 ère  partie

Lrsquoidentificateur blank

Qursquoarrive-t-il si vous vous souciez seulement de la premiegravere valeur retourneacutee MySqrt Toujours besoin de prendre en compte la seconde valeur

Solution lrsquoidentificateur blank _ (underscore)

Ne pas se soucier de la 2egraveme valeur booleacuteenne renvoyeacutee par MySqrtval _ = MySqrt(foo())

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 45: Le langage   Go  1 ère  partie

Fonctions avec reacutesultats variablesLes paramegravetres reacutesultat sont des variables concrecirctes que vous

pouvez utiliser si vous les nommez func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true else vok = 0false return vok

Les variables reacutesultat sont initialiseacutees agrave zeacutero (000 false etc selon le type) func MySqrt(f float64) (v float64 ok bool)

if f gt= 0 vok = mathSqrt(f) true return vok

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 46: Le langage   Go  1 ère  partie

Le retour videFinallement un retour sans expression retourne les valeurs existantes des variables de retour

Deux versions de plus de MySqrt func MySqrt(f float64) (v float64 ok bool) if f gt= 0 vok = mathSqrt(f) true return must be explicit

func MySqrt(f float64) (v float64 ok bool) if f lt 0 return error casereturn mathSqrt(f)true

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 47: Le langage   Go  1 ère  partie

Quid au sujet du zeacuteroToute la meacutemoire en Go est initialiseacutee Toutes les variables sont initialiseacutees au

moment de lrsquoexeacutecution de leur deacuteclaration Sans une expression drsquoinitialisation la valeur ldquozeacuterordquo du type concerneacute est utiliseacutee

La bouclefor i = 0 i lt 5 i++

var v intfmtPrintf(d v)v = 5

affichera 0 0 0 0 0

La valeur zeacutero deacutepend du type numeric 0 boolean false empty string nil pointer map slice channel zeroed struct etc

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 48: Le langage   Go  1 ère  partie

DeferLrsquoinstruction defer exeacutecute une fonction (ou meacutethode) quand la fonction appelante se termine Les arguments sont eacutevalueacutes agrave lrsquoendroit ougrave le defer est deacuteclareacute lrsquoappel de fonction survient au retour de la fonction

func data(fileName string) string f = osOpen(fileName)defer fClose()contents = ioReadAll(f)return contents

Utile pour fermer des descripteurs de fichier deacutelocker des mutex hellip

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 49: Le langage   Go  1 ère  partie

Une invocation de fonction par defer

Chaque defer qui srsquoexeacutecute met dans une file un appel de fonction agrave exeacutecuter ulteacuterieurement dans lrsquoordre LIFO ainsi

func f() for i = 0 i lt 5 i++ defer fmtPrintf(d i)

affiche 4 3 2 1 0

Vous pouvez fermer tous les descripteurs de fichier ou deacutelocker tous les mutex agrave la fin de la fonction

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 50: Le langage   Go  1 ère  partie

Tracer avec un deferfunc trace(s string) fmtPrintln(entering s) func untrace(s string) fmtPrintln(leaving s)

func a() trace(a)defer untrace(a)fmtPrintln(in a)

func b()

trace(b)defer untrace(b)fmtPrintln(in b)a()

func main() b()

Mais vous pouvez le faire plus proprement

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 51: Le langage   Go  1 ère  partie

Args sont eacutevalueacutes maintenant defer plus tard

func trace(s string) string fmtPrintln(entering s)return s

func un(s string)

fmtPrintln(leaving s)func a()

defer un(trace(a))fmtPrintln(in a)

func b()

defer un(trace(b))fmtPrintln(in b)a()

func main() b()

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 52: Le langage   Go  1 ère  partie

Les liteacuteraux fonction

Comme en C les fonctions ne peuvent pas ecirctre deacuteclareacutees agrave lrsquointeacuterieur des fonctions ndash mais les liteacuteraux fonctionpeuvent ecirctre affecteacutes agrave des variables

func f() for i = 0 i lt 10 i++ g = func(i int) fmtPrintf(di) g(i)

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 53: Le langage   Go  1 ère  partie

Les liteacuteraux fonction sont des laquo closures raquo

Les liteacuteraux fonction sont en fait des ldquoclosuresrdquofunc adder() (func(int) int) var x intreturn func(delta int) int x += deltareturn x

f = adder()fmtPrint(f(1))fmtPrint(f(20))fmtPrint(f(300))

affiche 1 21 321 - x srsquoaccumulant dans f(delta)

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 54: Le langage   Go  1 ère  partie

Construction drsquoun programme

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 55: Le langage   Go  1 ère  partie

PackagesUn programme est construit comme un ldquopackagerdquo qui peut utiliser des

faciliteacutes drsquoautres packages

Un programme Go est creacuteeacute par lrsquoassemblage drsquoun ensemble de ldquopackagesrdquo

Un package peut ecirctre construit agrave partir de plusieurs fichiers source

Les noms dans les packages importeacutes sont acceacutedeacutes via un ldquoqualified identifier

packagenameItemname

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 56: Le langage   Go  1 ère  partie

Structure drsquoun fichier sourceChaque fichier source contient

- Une clause package ce nom est le nom par deacutefaut utiliseacute par les packages qui importentpackage fmt

- Un ensemble optionnel de deacuteclarations drsquoimport import fmt use default nameimport myFmt fmt use the name myFmt

- Des declarations zeacutero ou plus globales ou package-levelldquo

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 57: Le langage   Go  1 ère  partie

Un package simple fichierpackage main Ce fichier fait partie du package

ldquomainrdquo

import fmt ce fichier utilise le package fmtldquo

const hello = Hello Bonjournrdquo

func main() fmtPrint(hello)

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 58: Le langage   Go  1 ère  partie

Main et mainmain

Chaque programme Go contient un package appeleacute main et sa fonction associeacutee maintout comme en C C++ ets la fonction de deacutemarrage du programme

La fonction mainmain ne prends pas drsquoargument et ne retourne pas de valeur Le programme sort immeacutediatement et avec succegraves quand mainmain se termine

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 59: Le langage   Go  1 ère  partie

Le package OSLe package os fournit Exit et les accegraves aux entreacuteessorties fichier lignes de

commande etchellip Une version de echo(1)package mainimport (

fmtos

)func main()

if len(osArgs) lt 2 length of argument sliceosExit(1)for i = 1 i lt len(osArgs) i++ fmtPrintf(arg d sn i osArgs[i])

fin == osExit(0)

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 60: Le langage   Go  1 ère  partie

Visibiliteacute globale et packageA lrsquointeacuterieur drsquoun package toutes les variables fonctions types et constantes globales sont visibles de tous les fichiers source du package

Pour les clients (importers) du package les noms doivent ecirctre en majuscule pour ecirctre visibles variables fonctions types constantes plus les meacutethodes ainsi que les champs de structure pour les variables et les types globaux

const hello = you smell visibiliteacute packageconst Hello = you smell nice visibiliteacute globaleconst _Bye = stinko _ nrsquoest pas majuscule

Tregraves diffeacuterent du CC++ pas drsquoextern ni static ni private ni public

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 61: Le langage   Go  1 ère  partie

Initialisation

Deux faccedilons drsquoinitialiser les variables globales avant lrsquoexeacutecution de mainmain

1) Une deacuteclaration globale avec un initialiseur 2) A lrsquointeacuterieur drsquoune fonction init()

La deacutependence des packages garantit un ordre drsquoexcution correcte

Lrsquoinitialisation est toujours une seule tacircche

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 62: Le langage   Go  1 ère  partie

Example drsquoinitialisationpackage transcendentalimport mathvar Pi float64func init()

Pi = 4mathAtan(1) init function computes Pi================package mainimport (

fmttranscendental

)var twoPi = 2transcendentalPi decl calcule twoPifunc main()

fmtPrintf(2Pi = gn twoPi)================Output 2Pi = 6283185307179586

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 63: Le langage   Go  1 ère  partie

La construction des package et programme

Pour construire un programme les packages et les fichiers agrave lrsquointeacuterieurs de ceux-ci doivent ecirctre compileacutes dans lrsquoordre correct Les deacutependances de package deacuteterminent lrsquoordre dans lequel les packages agrave construire

A lrsquointeacuterieur drsquoun package les fichiers source doivent ecirctre tous compileacutes ensemble Le package est compileacute comme une uniteacute et de maniegravere conventionelle chaque reacutepertoire contient un package En ignorant les tests

cd mypackage6g go

Habituellement nous utilisons make des outils speacutecifiques agrave Go sont en cours de preacuteparation

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 64: Le langage   Go  1 ère  partie

Construire le package laquo fmt raquo pwdUsersrgosrcpkgfmt lsMakefile fmt_testgo formatgo printgo make eacutecrit agrave la main mais trivial lsMakefile _go_6 _obj fmt_testgo formatgo printgo make clean make

Les objets sont placeacutes dans le sous-reacutepertoire _obj

Les makefiles sont eacutecrits en utilisant des ldquohelpersrdquo appeleacutes Makepkg etchellip voir les sources

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 65: Le langage   Go  1 ère  partie

TestsPour tester un package eacutecrire un ensemble de fichiers sources Go appartenant au mecircme package donner les noms des fichiers de la forme

_testgo

A lrsquointeacuterieur de ces fichiers les fonctions globales avec des noms commenccedilant par Test[^a-z]seront exeacutecuteacutees par lrsquooutil de test gotest Ces fonctions doivent une signature eacutequivalente agrave

func TestXxx(t testingT)

Le package testing fournit le support pour le log le benchmarking et le reporting drsquoerreur

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 66: Le langage   Go  1 ère  partie

Un exemple de testInteresting pieces from fmt_testgo

package fmt package est fmt pas mainimport (

testing)func TestFlagParser(t testingT)

var flagprinter flagPrinterfor i = 0 i lt len(flagtests) i++ tt = flagtests[i]s = Sprintf(ttin ampflagprinter)if s = ttout tErrorf(Sprintf(q ampflagprinter) =gt q+ want q ttin s ttout)

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 67: Le langage   Go  1 ère  partie

Test gotest lsMakefile fmta fmt_testgo formatgo printgo gotest par defaut fait tous les _testgoPASSwally= gotest -v fmt_testgo=== RUN fmtTestFlagParser--- PASS fmtTestFlagParser (000 seconds)=== RUN fmtTestArrayPrinter--- PASS fmtTestArrayPrinter (000 seconds)=== RUN fmtTestFmtInterface--- PASS fmtTestFmtInterface (000 seconds)=== RUN fmtTestStructPrinter--- PASS fmtTestStructPrinter (000 seconds)=== RUN fmtTestSprintf--- PASS fmtTestSprintf (000 seconds) plus un peu plusPASS

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 68: Le langage   Go  1 ère  partie

Un exemple de benchmarkBenchmarks ont une signature

func BenchmarkXxxx(b testingB)

Et on boucle sur bN le package testing fait le reste

Ci dessous un exemple de fichier fmt_testgo

package fmt package est fmt pas mainimport (

testing)func BenchmarkSprintfInt(b testingB)

for i = 0 i lt bN i++ Sprintf(d 5)

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 69: Le langage   Go  1 ère  partie

Benchmarking gotest gotest -bench= expression reacuteguliegraverefmt_testBenchmarkSprintfEmpty 5000000 310 nsopfmt_testBenchmarkSprintfString 2000000 774 nsopfmt_testBenchmarkSprintfInt 5000000 663 nsopfmt_testBenchmarkSprintfIntInt 2000000 969 nsop

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 70: Le langage   Go  1 ère  partie

Bibliothegraveques de codebull Les bibliothegraveques sont juste des packagesbull Lrsquoensemble des bibliothegraveques est modeste mais croissantbull Des exemples

Package But Exemples

fmt IO formateacutees Printf Scanfos Interface OS Open read Writestrconv Nombreslt-gt chaines Atoi Atof ItoaIo IO geacuteneacuteriques Copy PipeFlag Flags --help etchellip Bool StringLog Log des eacutevegravenements Logger PrintfRegexp Expressions reacuteguliegraveres Compile MatchTemplate HTML etchellip Parse ExecuteBytes Tableaux drsquooctets Compare Buffer

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 71: Le langage   Go  1 ère  partie

Un peut plus au sujet de fmtLe package fmt contient des noms familiers en avec la poremiegravere lettre en

majusculePrintf ndash affiche sur la sortie standard Sprintf ndash retourne une chaine de caractegraveresFprintf ndash eacutecrit sur osStderr etc (demain)

Mais aussi Print Sprint Fprint ndash pas de formatagePrintln Sprintln Fprintln ndash pas de formatage ajoute des

espaces final n

fmtPrintf(d d gn 1 2 35)fmtPrint(1 2 35 n)fmtPrintln(1 2 35)

Chacune produit le mecircme reacutesultat 1 2 35n

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 72: Le langage   Go  1 ère  partie

Bibliothegraveque documentation

Le code source contient des commentaires La ligne de commande ou lrsquooutil web extrait ces commentaires

Link httpgolangorgpkg

Command godoc fmt godoc fmt Printf

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 73: Le langage   Go  1 ère  partie

Exercices

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 74: Le langage   Go  1 ère  partie

Exercices 1er jourInitialiser lrsquoenvironnement - voir

httpgolangorgdocinstallhtml

Vous connaissez tous les suites de fibonacciEcrire un package pour les impleacutementer Il devrait y avoir une fonction pour reacutecupeacuterer la valeur (vous ne connsaissez pas encore les struct pouvez trouver une faccedilon de sauver lrsquoeacutetat sans les globales) Mais agrave la place de lrsquoaddition faire une opeacuteration fournie sous forme de fonction par lrsquoutilisateur Entiers Flottants Chaines de caractegraveres Crsquoest agrave votre convenance

Ecrire une petit test gotest pour votre package

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 75: Le langage   Go  1 ère  partie

Prochaine leccedilon

bull Les types composite bull Les meacutethodesbull Les interfaces

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain
Page 76: Le langage   Go  1 ère  partie

A demain

  • Le langage Go 1egravere partie
  • Qui
  • Plan du cours
  • Aperccedilu du cours drsquoaujourdrsquohui
  • Motivations
  • Pourquoi un nouveau langage
  • Pour positiver
  • Ressources
  • Status compilateurs
  • Les bases
  • Codons
  • Bases du langage
  • Structure lexicale
  • Liteacuteraux
  • Aperccedilu de la syntaxe
  • Point virgule
  • Les types numeacuteriques
  • Bool
  • String
  • Expressions
  • Expressions Go vs Expressions C
  • Exemples
  • Conversions numeacuteriques
  • Constantes
  • Expressions constantes
  • Conseacutequence des nombre ideacuteaux
  • Deacuteclarations
  • Var
  • Var distribueacute
  • La laquo deacuteclaration courte raquo =
  • Les constantes
  • Iota
  • Types
  • New
  • Affectations
  • Les structures de controcircles
  • Forme des structures de controcircle
  • If
  • For
  • Switch
  • Switch (2)
  • Break continue etchellip
  • Fonctions
  • Lrsquoidentificateur blank
  • Fonctions avec reacutesultats variables
  • Le retour vide
  • Quid au sujet du zeacutero
  • Defer
  • Une invocation de fonction par defer
  • Tracer avec un defer
  • Args sont eacutevalueacutes maintenant defer plus tard
  • Les liteacuteraux fonction
  • Les liteacuteraux fonction sont des laquo closures raquo
  • Construction drsquoun programme
  • Packages
  • Structure drsquoun fichier source
  • Un package simple fichier
  • Main et mainmain
  • Le package OS
  • Visibiliteacute globale et package
  • Initialisation
  • Example drsquoinitialisation
  • La construction des package et programme
  • Construire le package laquo fmt raquo
  • Tests
  • Un exemple de test
  • Test gotest
  • Un exemple de benchmark
  • Benchmarking gotest
  • Bibliothegraveques de code
  • Un peut plus au sujet de fmt
  • Bibliothegraveque documentation
  • Exercices
  • Exercices 1er jour
  • Prochaine leccedilon
  • A demain