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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 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
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
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
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
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
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
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
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
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
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
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
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
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 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Prochaine leccedilon
bull Les types composite bull Les meacutethodesbull Les interfaces
A demain
A demain
Top Related