Le langage Go 2ème partie

44
Le langage Go 2ème partie Rob Pike [email protected] Traduction en français, adaptation xavier.mehaut @ gmail.com (Version de Juin 2011)

description

Le langage Go 2ème partie. Rob Pike [email protected] Traduction en français, adaptation xavier.mehaut @ gmail.com (Version de Juin 2011). Sommaire de la journée. Exercices des questions? Types composite structures, arrays , slices, maps Méthodes - PowerPoint PPT Presentation

Transcript of Le langage Go 2ème partie

Page 1: Le langage  Go  2ème partie

Le langage Go

2egraveme partie

Rob Pikergooglecom

Traduction en franccedilais adaptation xaviermehaut gmailcom

(Version de Juin 2011)

Sommaire de la journeacutee

Exercicesdes questions

Types compositestructures arrays slices maps

Meacutethodestheyre not just for structs any more

Interfaces

Exercices

Des questions

Tableaux

Tableaux (arrays)Les tableaux en Go sont quelque peu diffeacuterents de ceux en C plus comme des tableaux en Pascal (Slices le prochain sujet se comportent un peu plus comme des tableaux C)

var ar [3]int deacuteclares ar comme eacutetant un tableau de 3 entiers initialiseacutes agrave zeacutero

La taille fait partie du type

La fonction native len renvoie la taille len(ar) == 3

Les tableaux sont des valeursLes tableaux sont des valeurs pas des pointeurs implicites comme en C Vous pouvez reacutecupeacuterer lrsquoadresse drsquoun tableau attribuer un pointeur agrave un tableau (par exemple pour le passer efficacement sans recopie agrave une fonction)

func f(a [3]int) fmtPrintln(a) func fp(a [3]int) fmtPrintln(a) func main()

var ar [3] intf(ar) passe une copie de arfp(ampar) passe un pointeur sur ar

Sortie(Print et consors reconnaissent les tableaux) [0 0 0]amp[0 0 0]

Les liteacuteraux tableauTous les types composite ont une syntaxe similaire pour la creacuteation des valeurs Pour les tableaux cela ressemble agrave

Tableau de 3 entiers[3]int1 2 3

Tableau de 10 entiers les trois premiers nrsquoeacutetant pas agrave zeacutero[10]int 1 2 3

Vous ne voulez pas compter Utilisez pour la initialiser la longueur[]int1 2 3

Vous ne voulez pas tous les initialiser Utilisez les paires keyvalue [10]int21 31 51 71

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 2: Le langage  Go  2ème partie

Sommaire de la journeacutee

Exercicesdes questions

Types compositestructures arrays slices maps

Meacutethodestheyre not just for structs any more

Interfaces

Exercices

Des questions

Tableaux

Tableaux (arrays)Les tableaux en Go sont quelque peu diffeacuterents de ceux en C plus comme des tableaux en Pascal (Slices le prochain sujet se comportent un peu plus comme des tableaux C)

var ar [3]int deacuteclares ar comme eacutetant un tableau de 3 entiers initialiseacutes agrave zeacutero

La taille fait partie du type

La fonction native len renvoie la taille len(ar) == 3

Les tableaux sont des valeursLes tableaux sont des valeurs pas des pointeurs implicites comme en C Vous pouvez reacutecupeacuterer lrsquoadresse drsquoun tableau attribuer un pointeur agrave un tableau (par exemple pour le passer efficacement sans recopie agrave une fonction)

func f(a [3]int) fmtPrintln(a) func fp(a [3]int) fmtPrintln(a) func main()

var ar [3] intf(ar) passe une copie de arfp(ampar) passe un pointeur sur ar

Sortie(Print et consors reconnaissent les tableaux) [0 0 0]amp[0 0 0]

Les liteacuteraux tableauTous les types composite ont une syntaxe similaire pour la creacuteation des valeurs Pour les tableaux cela ressemble agrave

Tableau de 3 entiers[3]int1 2 3

Tableau de 10 entiers les trois premiers nrsquoeacutetant pas agrave zeacutero[10]int 1 2 3

Vous ne voulez pas compter Utilisez pour la initialiser la longueur[]int1 2 3

Vous ne voulez pas tous les initialiser Utilisez les paires keyvalue [10]int21 31 51 71

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 3: Le langage  Go  2ème partie

Exercices

Des questions

Tableaux

Tableaux (arrays)Les tableaux en Go sont quelque peu diffeacuterents de ceux en C plus comme des tableaux en Pascal (Slices le prochain sujet se comportent un peu plus comme des tableaux C)

var ar [3]int deacuteclares ar comme eacutetant un tableau de 3 entiers initialiseacutes agrave zeacutero

La taille fait partie du type

La fonction native len renvoie la taille len(ar) == 3

Les tableaux sont des valeursLes tableaux sont des valeurs pas des pointeurs implicites comme en C Vous pouvez reacutecupeacuterer lrsquoadresse drsquoun tableau attribuer un pointeur agrave un tableau (par exemple pour le passer efficacement sans recopie agrave une fonction)

func f(a [3]int) fmtPrintln(a) func fp(a [3]int) fmtPrintln(a) func main()

var ar [3] intf(ar) passe une copie de arfp(ampar) passe un pointeur sur ar

Sortie(Print et consors reconnaissent les tableaux) [0 0 0]amp[0 0 0]

Les liteacuteraux tableauTous les types composite ont une syntaxe similaire pour la creacuteation des valeurs Pour les tableaux cela ressemble agrave

Tableau de 3 entiers[3]int1 2 3

Tableau de 10 entiers les trois premiers nrsquoeacutetant pas agrave zeacutero[10]int 1 2 3

Vous ne voulez pas compter Utilisez pour la initialiser la longueur[]int1 2 3

Vous ne voulez pas tous les initialiser Utilisez les paires keyvalue [10]int21 31 51 71

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 4: Le langage  Go  2ème partie

Tableaux

Tableaux (arrays)Les tableaux en Go sont quelque peu diffeacuterents de ceux en C plus comme des tableaux en Pascal (Slices le prochain sujet se comportent un peu plus comme des tableaux C)

var ar [3]int deacuteclares ar comme eacutetant un tableau de 3 entiers initialiseacutes agrave zeacutero

La taille fait partie du type

La fonction native len renvoie la taille len(ar) == 3

Les tableaux sont des valeursLes tableaux sont des valeurs pas des pointeurs implicites comme en C Vous pouvez reacutecupeacuterer lrsquoadresse drsquoun tableau attribuer un pointeur agrave un tableau (par exemple pour le passer efficacement sans recopie agrave une fonction)

func f(a [3]int) fmtPrintln(a) func fp(a [3]int) fmtPrintln(a) func main()

var ar [3] intf(ar) passe une copie de arfp(ampar) passe un pointeur sur ar

Sortie(Print et consors reconnaissent les tableaux) [0 0 0]amp[0 0 0]

Les liteacuteraux tableauTous les types composite ont une syntaxe similaire pour la creacuteation des valeurs Pour les tableaux cela ressemble agrave

Tableau de 3 entiers[3]int1 2 3

Tableau de 10 entiers les trois premiers nrsquoeacutetant pas agrave zeacutero[10]int 1 2 3

Vous ne voulez pas compter Utilisez pour la initialiser la longueur[]int1 2 3

Vous ne voulez pas tous les initialiser Utilisez les paires keyvalue [10]int21 31 51 71

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 5: Le langage  Go  2ème partie

Tableaux (arrays)Les tableaux en Go sont quelque peu diffeacuterents de ceux en C plus comme des tableaux en Pascal (Slices le prochain sujet se comportent un peu plus comme des tableaux C)

var ar [3]int deacuteclares ar comme eacutetant un tableau de 3 entiers initialiseacutes agrave zeacutero

La taille fait partie du type

La fonction native len renvoie la taille len(ar) == 3

Les tableaux sont des valeursLes tableaux sont des valeurs pas des pointeurs implicites comme en C Vous pouvez reacutecupeacuterer lrsquoadresse drsquoun tableau attribuer un pointeur agrave un tableau (par exemple pour le passer efficacement sans recopie agrave une fonction)

func f(a [3]int) fmtPrintln(a) func fp(a [3]int) fmtPrintln(a) func main()

var ar [3] intf(ar) passe une copie de arfp(ampar) passe un pointeur sur ar

Sortie(Print et consors reconnaissent les tableaux) [0 0 0]amp[0 0 0]

Les liteacuteraux tableauTous les types composite ont une syntaxe similaire pour la creacuteation des valeurs Pour les tableaux cela ressemble agrave

Tableau de 3 entiers[3]int1 2 3

Tableau de 10 entiers les trois premiers nrsquoeacutetant pas agrave zeacutero[10]int 1 2 3

Vous ne voulez pas compter Utilisez pour la initialiser la longueur[]int1 2 3

Vous ne voulez pas tous les initialiser Utilisez les paires keyvalue [10]int21 31 51 71

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 6: Le langage  Go  2ème partie

Les tableaux sont des valeursLes tableaux sont des valeurs pas des pointeurs implicites comme en C Vous pouvez reacutecupeacuterer lrsquoadresse drsquoun tableau attribuer un pointeur agrave un tableau (par exemple pour le passer efficacement sans recopie agrave une fonction)

func f(a [3]int) fmtPrintln(a) func fp(a [3]int) fmtPrintln(a) func main()

var ar [3] intf(ar) passe une copie de arfp(ampar) passe un pointeur sur ar

Sortie(Print et consors reconnaissent les tableaux) [0 0 0]amp[0 0 0]

Les liteacuteraux tableauTous les types composite ont une syntaxe similaire pour la creacuteation des valeurs Pour les tableaux cela ressemble agrave

Tableau de 3 entiers[3]int1 2 3

Tableau de 10 entiers les trois premiers nrsquoeacutetant pas agrave zeacutero[10]int 1 2 3

Vous ne voulez pas compter Utilisez pour la initialiser la longueur[]int1 2 3

Vous ne voulez pas tous les initialiser Utilisez les paires keyvalue [10]int21 31 51 71

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 7: Le langage  Go  2ème partie

Les liteacuteraux tableauTous les types composite ont une syntaxe similaire pour la creacuteation des valeurs Pour les tableaux cela ressemble agrave

Tableau de 3 entiers[3]int1 2 3

Tableau de 10 entiers les trois premiers nrsquoeacutetant pas agrave zeacutero[10]int 1 2 3

Vous ne voulez pas compter Utilisez pour la initialiser la longueur[]int1 2 3

Vous ne voulez pas tous les initialiser Utilisez les paires keyvalue [10]int21 31 51 71

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 8: Le langage  Go  2ème partie

Pointeurs sur des liteacuteraux tableauVous pouvez reacutecupeacuterer lrsquoadresse drsquoun liteacuteral tableau afin drsquoavoir un pointeur sur une instance nouvellement creacuteeacutee

func fp(a [3]int) fmtPrintln(a) func main()

for i = 0 i lt 3 i++ fp(amp[3]inti ii iii)

Output

amp[0 0 0]amp[1 1 1]amp[2 4 8]

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 9: Le langage  Go  2ème partie

Les slices

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 10: Le langage  Go  2ème partie

Les slicesUne tranche (slice) est une reacutefeacuterence vers une section drsquoune tableau Les slices sont habituellement plus utiliseacutees que des tableaux pleins Une slice ne coute pas grand chose en place et performance (plus agrave venir)

Un type slice ressemble agrave un type tableau sans la taille var a []int

La fonction native len(a) retourne le nombre drsquoeacuteleacutements de la tranche

On creacutee une slice en tranchant un tableau ou une autre slice a = ar[79]

Les index valides de a seront alors 0 et 1 len(a)==2

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 11: Le langage  Go  2ème partie

Raccourcis pour les slices

Quand on creacutee une slice le premier index est par deacutefaut agrave 0 ar[n] signifie ar[0n]

Le second index est par deacutefaut len(arrayslice)ar[n] signifie ar[nlen(ar)]

Enfin pour creacuteer une slice drsquoun tableau ar[] signifie ar[0len(ar)]

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 12: Le langage  Go  2ème partie

Un slice reacutefeacuterence un tableau Conceptually

type Slice struct base elemType pointeur sur le 0egraveme eacuteleacutementlen int nb drsquoeacuteleacutements dans la slicecap int num drsquoeacuteleacutements disponibles

Arrayar

Slicea=ar[79]

7 1 5 4 3 8 7 2 11 5 3

base=ampar[7] len=2 cap=4

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 13: Le langage  Go  2ème partie

Construire une sliceLes liteacuteraux slice ressemblent agrave des liteacuteraux tableau sans la taille

var slice = []int12345Ce qui se passe crsquoest la creacuteation drsquoun tableau de longueur 5 suivie de la creacuteation drsquoune slice qui y fait reacutefeacuterence

Nous pouvons eacutegalement allouer une slice (et le tableau sous-jacent) avec la fonction native make

var s100 = make([]int 100) slice 100 ints

Pourquoi make et pas new Parce nous avons besoin de fabriquer une slice et pas seulement drsquoallouer de la meacutemoire Notez que make([]int 10) retourne []int tandis que new([]int) retourne []int

Utilisez make pour creacuteer des slices des maps et des channels (plus tard dans le cours)

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 14: Le langage  Go  2ème partie

La capaciteacute drsquoune sliceUne slice fait reacutefeacuterence agrave un tableau sous-jacent ainsi il peut y avoir des eacuteleacutements agrave lrsquoexpreacutemiteacute de la slice qui sont preacutesents dans le tableau

La fonction native cap (capacity) indique jusqursquoagrave quelle taille la slicepourrait encore grossir srsquoil le fallait

Apregravesvar ar = [10]int0123456789var a = ar[57] reacutefeacuterence vers le sous-tableau56

len(a) est 2 et cap(a) est 5 On peut reslicera = a[04] reacutefeacuterence vers le sous-tableau 5678

len(a) est deacutesormais 4 mais cap(a) est toujours 5

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 15: Le langage  Go  2ème partie

Retailler une sliceLes slices peuvent ecirctre utiliseacutees pour faire grossir un tableau

var sl = make([]int 0 100) len 0 cap 100

func appendToSlice(i int sl []int) []int if len(sl) == cap(sl) error() n = len(sl)sl = sl[0n+1] eacutetend drsquoune longueur de 1sl[n] = ireturn sl

Ainsi la longueur de sl est toujours le nombre drsquoeacuteleacutements mais il grossit avec le besoin Ce style est leacuteger et propre agrave Go

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 16: Le langage  Go  2ème partie

Les slices sont leacutegegraveresSentez vous libres drsquoallouer et de retailler des slices comme vous lrsquoentendez Elles sont leacutegegraveres pas de besoin drsquoallocation Souvenez-vous que ce sont des reacutefeacuterences ainsi le stockage sous-jacent peut ecirctre modifieacute

Par exemple les IO utilisent des slices pas des compteursfunc Read(fd int b []byte) intvar buffer [100]bytefor i = 0 i lt 100 i++

remplit le buffer un octet agrave la foisRead(fd buffer[ii+1]) pas drsquoallocation ici

Scinder un buffer

header data = buf[n] buf[n]

Les chaicircnes de caractegraveres peuvent ecirctre sliceacutees eacutegalement avec la mecircme efficaciteacute

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 17: Le langage  Go  2ème partie

Les dictionnaires (maps)

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 18: Le langage  Go  2ème partie

Les dictionnaires (Map)Les dictionnaires sont un autre type de reacutefeacuterence Ils sont deacuteclareacutes

de la faccedilon suivante var m map[string]float64

Ceci deacuteclare un dictionnaire indexeacute avec une clef de type string et une valeur de type float64

Crsquoest analogue agrave ce que lrsquoon trouve en C++type mapltstringfloat64gt (note the )

Etant donneacute un dictionnaire m len(m) retourne le nombre de clefs

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 19: Le langage  Go  2ème partie

Creacuteation drsquoun dictionnaireComme avec une slice une variable dictionnaire ne se reacutefegravere agrave rien vous devez mettre quelque chose dedans avant de lrsquoutiliser

Trois faccedilons de le faire 1) Liteacuteral liste de clefvaleur

m = map[string]float6411 pi31415

2) Creacuteationm = make(map[string]float64) make pas new

3) Affectationvar m1 map[string]float64m1 = m m1 and m now refer to same map

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 20: Le langage  Go  2ème partie

Indexation drsquoun dictionnaire(Les prochains exemples utilisent tous

m = map[string]float6411 pi31415)

Accegravede agrave un eacuteleacutement comme agrave une valeur si pas preacutesente renvoie une valeur zeacutero

one = m[1]zero = m[pas preacutesent] mets zero agrave 00

Stocke un eacuteleacutement

m[2] = 2m[2] = 3

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 21: Le langage  Go  2ème partie

Test de lrsquoexistencePour tester si une clef est peacutesente dans un dictionnaire nous pouvons utiliser une affectation multiple la forme ldquovirgule ok(comma ok)rdquo

m = map[string]float6411 pi31415var value float64var present boolvalue present = m[x]

or idiomatiquement

value ok = m[x] la forme comma ok

Si x est preacutesent dans le dictionnaire positionne le booleacuteen agrave true et la valeur et reacutecupegravere la valeur associeacute agrave la clef donneacutee Si non positionne le booleacuteen agrave false et renvoie la valeur zero pour le type consideacutereacute

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 22: Le langage  Go  2ème partie

SuppressionLa suppression drsquoune entreacutee se fait de la maniegravere suivante

m = map[string]float64110 pi31415var keep boolvar value float64var x string = f()m[x] = v keep

Si keep est true lrsquoaffectation de v dans le dictionnaire srsquoeffectue bien si keep est false lrsquoentreacutee du dictionnaire pour la clef x est supprimeacuteem[x] = 0 false supprime lrsquoentreacutee pour x

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 23: Le langage  Go  2ème partie

For et rangeLa boucle for possegravede une syntaxe speacuteciale dans le cas drsquoune iteacuteration sur un tableau drsquoune slice ou drsquoun dictionnaire

m = map[string]float64110 pi31415for key value = range m fmtPrintf(key s value gn key value)

Srsquoil nrsquoy a qursquoune seule variable ne reacutecupegravere que la clef for key = range m fmtPrintf(key sn key)

Les variables peuvent ecirctre affecteacutees ou deacuteclareacutees en utilisant = Pour les tableaux et les slices renvoie lrsquoindex et la valeur

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 24: Le langage  Go  2ème partie

Range sur une chaicircne de caractegraveresUn for utilisant un range sur une chaicircne boucle sur les points code Unicode non sur les octets (Utiliser []byte pour les octets ou utiliser le for standard) La chaicircne est consideacutereacutee devant contenir des caractegraveres en UTF-8

La boucles = [u00ffu754c]for i c = range s

fmtPrintf(dq i c) q for quoted

affiche 0[ 1yuml 31049988 6]lsquo

Si un UTF-8 est erroneacute le caractegravere est mis agrave U+FFFD et lrsquoindex avance drsquoun seul octet

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 25: Le langage  Go  2ème partie

Structs

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 26: Le langage  Go  2ème partie

StructsLes structures vont vous sembler familiegraveres ce sont de simples deacuteclarations de

champs var p struct x y float64

De maniegravere plus communetype Point struct x y float64

var p Point

Les structs permettent au programmeur de deacutefinir les bornes meacutemoire

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 27: Le langage  Go  2ème partie

Les structs sont des valeursLes structs sont des valeurs et new(StructType) retourne un pointeur sur une valeur zeacutero (memoire tout agrave zeacutero)

type Point struct x y float64

var p Pointpx = 7py = 234var pp Point = new(Point)pp = pppx = Pi sucre syntaxique pour(pp)x

Il nrsquoexiste pas de notation -gt pour les pointeurs sur structure Go vous fournit lrsquoindirection pour vous

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 28: Le langage  Go  2ème partie

Construction des structsLes structures sont des valeurs ainsi vous pouvez en faire une ldquozeacuterofieacuteerdquo juste en la deacuteclarant

var p Point zeroed valueVous pouvez aussi en allouer une avec new

pp = new(Point) allocation idiomatique

Les liteacuteraux struct ont la syntaxe attenduep = Point72 84p = Pointy84 x72pp = ampPoint72 84 idiomatiquepp = ampPoint eacutegalement idiomatique == new(Point)

Comme avec les tableaux prendre lrsquoadresse drsquoun liteacuteral struct donne lrsquoadresse drsquoune valeur nouvellement creacuteeacutee

Ces exemples sont des constructeurs

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 29: Le langage  Go  2ème partie

Exportation des types et champsLes champs (et meacutethodes agrave venir) drsquoune structure doivent commencer avec une majuscule pour ecirctre visible agrave lrsquoexteacuterieur du package

Type et champs priveacutes type point struct x y float64

Typeet champs exporteacutes type Point struct X Y float64

Type exporteacute avec un mix des champstype Point struct X Y float64 exporteacutename string pas exporteacute

Vous pouvez mecircme avoir un type priveacute avec des champs exporteacutes Exercice quand est-ce utile

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 30: Le langage  Go  2ème partie

Champs anonymesA lrsquointeacuterieur drsquoune structure vous pouvez deacuteclarer des champs comme une autre structure sans leur donner un nom de champ

Crsquoest ce que lrsquoon appelle des champs anonymes et ils se comportent comme si les stcuture interne eacutetait simplement inseacutereacutee ou ldquoembarqueacuteerdquo agrave lrsquoexteacuterieur

Ce meacutecanisme simple fournit une faccedilon de deacuteriver quelques uns ou la totaliteacute de votre impleacutementation drsquoun autre type ou de types

Un exemple agrave suivre pour illustrer le propos

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 31: Le langage  Go  2ème partie

Un champ struct anonymetype A struct

ax ay inttype B struct

Abx by float64

B agit comme si il posseacutedait 4 champs ax ay bx et by Crsquoest presque comme si B eacutetait ax ay int bx by float64

Neacuteanmoins les liteacuteraux comme B doivent ecirctre remplis dans le deacutetail

b = BA1 2 30 40fmtPrintln(bax bay bbx bby)

Affiche 1 2 3 4

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 32: Le langage  Go  2ème partie

Les champs anonymes ont le type comme nom

Mais crsquoest plus riche qursquoune simple interpolation de champs B aussi a un champ A Le champ anonyme ressemble agrave un champ dont le nom est son type

b = BA 1 2 30 40fmtPrintln(bA)

Affiche 1 2

Si A venait drsquoun autre package le champ srsquoappelerait eacutegalement Aimport pkgtype C struct pkgA c = C pkgA1 2fmtPrintln(cA) pas cpkgA

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 33: Le langage  Go  2ème partie

Champs anonymes de nrsquoimporte quel type

Nrsquoimporte quel type nommeacute ou pointer sur celui-ci peut ecirctre utiliseacute dans un type anonyme et peut apparaicirctre agrave nrsquoimporte quel endroit de la structure

type C struct x float64intstring

c = C35 7 bonjourfmtPrintln(cx cint cstring)

Affiche 35 7 bonjour

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 34: Le langage  Go  2ème partie

Conflits et masquageSrsquoil existe deux champs avec les mecircme noms (eacuteventuellement un nom de type deacuteriveacute) les regravegles suivantes srsquoappliquent

1) Un champ externe masque un champs interne Ceci fournit une faccedilon de surcharger un champs ou une meacutethode

2) Si le mecircme nom apparait deux fois agrave un mecircme niveau crsquoest une erreur si le nom est utiliseacute par le programme (si pas utiliseacute pas de problegraveme)

Pas de regravegles pour reacutesoudre les ambiguiumlteacutes doit ecirctre corrigeacute par le programmeur

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 35: Le langage  Go  2ème partie

Exemples de conflitstype A struct a int type B struct a b int type C struct A B var c C

Utiliser ca est une erreur est-ce cAa ou cBatype D struct B b float64 var d D

Utiliser db est OK il srsquoagit de float64 et non de dBb

On peut acceacuteder agrave b via DBb

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 36: Le langage  Go  2ème partie

Meacutethodes

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 37: Le langage  Go  2ème partie

Meacutethodes sur les structuresGo ne possegravede pas de classes mais vous pouvez attacher des meacutethodes agrave nrsquoimporte quel type Les meacutethodes sont deacuteclareacutees de maniegravere seacutepareacutee des types comme des fonctions avec un reacutecepteur explicite

type Point struct x y float64 une meacutethode sur Pointfunc (p Point) Abs() float64 return mathSqrt(pxpx + pypy)

Note reacutecepteur explicite (pas de this automatique) dans le cas du type Point utiliseacute dans la meacutethode

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 38: Le langage  Go  2ème partie

Meacutethodes sur des valeurs structUne meacutethode ne requiegravere pas un pointeur comme reacutecepteur

type Point3 struct x y z float64 une meacutethode sur Point3func (p Point3) Abs() float64 return mathSqrt(pxpx + pypy + pzpz)

Ceci est une peu cher payeacute parce que Point3 sera toujours passeacute par valeur agrave la meacutethode et non par pointeur mais crsquoest valide en Go

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 39: Le langage  Go  2ème partie

Invocation drsquoune meacutethodeJuste comme vous y attendez

p = ampPoint 3 4 fmtPrint(pAbs()) affichera 5

Un exemple sans structuretype IntVector []intfunc (v IntVector) Sum() (s int)

for _ x = range v identificateur blanks += xreturn

fmtPrintln(IntVector1 2 3Sum()

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 40: Le langage  Go  2ème partie

Les regravegles de base des meacutethodes Les meacutethodes sont attacheacutees agrave un type nommeacute disons Foo et y sont lieacutees statiquement

Le type drsquoun reacutecepteur dans une meacutethode peut ecirctre soit Foo ou Foo Vous pouvez avoir des meacutethodes Foo et des meacutethodes Foo Foo lui-mecircme ne peut pas ecirctre un type pointeur bien que les meacutethodes puissent avoir un reacutecepteur de type Foo

Le type Foo doit ecirctre deacutefini dans le mecircme package que celui de ses meacutethodes

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 41: Le langage  Go  2ème partie

Pointeurs et valeursGo deacutereacutefeacuterence automatiquement les valeurs pour vous agrave lrsquoinvocation des meacutethodesPar exemple mecircme si une meacutethode possegravede un type reacutecepteur Point vous pouvez lrsquoinvoquer sur une valeur de type Point

p1 = Point 3 4 fmtPrint(p1Abs()) sucre syntaxique pour

(ampp1)Abs()

De maniegravere similaire si des meacutethodes sont sur Point3 vous pouvez utiliser une valeur de type Point3

p3 = ampPoint3 3 4 5 fmtPrint(p3Abs()) sucre syntaxique pour

(p3)Abs()

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 42: Le langage  Go  2ème partie

Meacutethodes sur des champs anonymes

Naturellement quand un champ anonyme est embarqueacute dans une structure les meacutethodes de ce type sont embarqueacutees de la mecircme faccedilon ndash en effet il herite des meacutethodes

Ce meacutecanisme offre une faccedilon simple drsquoeacutemuler certains effets du sous-classage et de lrsquoheacuteritage

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 43: Le langage  Go  2ème partie

Exemple de champ anonymetype Point struct x y float64 func (p Point) Abs() float64

type NamedPoint struct Pointname string

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 5

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode
Page 44: Le langage  Go  2ème partie

Surcharger une meacutethodeLa surcharge fonctionne juste comme avec les champs

type NamedPoint struct Pointname string

func (n NamedPoint) Abs() float64

return nPointAbs() 100

n = ampNamedPointPoint3 4 PythagorasfmtPrintln(nAbs()) prints 500

Bien entendu vous pouvez avoir des champs multiples anonymes avec des types varieacutes ndash une simple version de lrsquoheacuteritage multiple Les regravegles de reacutesolution des conflits rendent les choses simples neacuteanmoins

  • Le langage Go 2egraveme partie
  • Sommaire de la journeacutee
  • Exercices
  • Tableaux
  • Tableaux (arrays)
  • Les tableaux sont des valeurs
  • Les liteacuteraux tableau
  • Pointeurs sur des liteacuteraux tableau
  • Les slices
  • Les slices (2)
  • Raccourcis pour les slices
  • Un slice reacutefeacuterence un tableau
  • Construire une slice
  • La capaciteacute drsquoune slice
  • Retailler une slice
  • Les slices sont leacutegegraveres
  • Les dictionnaires (maps)
  • Les dictionnaires (Map)
  • Creacuteation drsquoun dictionnaire
  • Indexation drsquoun dictionnaire
  • Test de lrsquoexistence
  • Suppression
  • For et range
  • Range sur une chaicircne de caractegraveres
  • Structs
  • Structs (2)
  • Les structs sont des valeurs
  • Construction des structs
  • Exportation des types et champs
  • Champs anonymes
  • Un champ struct anonyme
  • Les champs anonymes ont le type comme nom
  • Champs anonymes de nrsquoimporte quel type
  • Conflits et masquage
  • Exemples de conflits
  • Meacutethodes
  • Meacutethodes sur les structures
  • Meacutethodes sur des valeurs struct
  • Invocation drsquoune meacutethode
  • Les regravegles de base des meacutethodes
  • Pointeurs et valeurs
  • Meacutethodes sur des champs anonymes
  • Exemple de champ anonyme
  • Surcharger une meacutethode