1 / 25

Le langage Go 2ème partie

Le langage Go 2ème partie. Rob Pike r@google.com 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

field
Télécharger la présentation

Le langage Go 2ème partie

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Le langage Go 2ème partie Rob Pike r@google.com Traduction en français, adaptation xavier.mehaut @gmail.com (Version de Juin 2011)

  2. Sommaire de la journée Exercices des questions? Types composite structures, arrays, slices, maps Méthodes they're not just for structs any more Interfaces

  3. Exercices Des questions?

  4. Tableaux

  5. Tableaux (arrays) Les tableaux en Go sontquelquepeudifférents 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 déclaresarcommeétant un tableau de 3 entiers, initialisés à zéro. La taille fait partie du type. La fonction native lenrenvoie la taille : len(ar) == 3

  6. Les tableaux sont des valeurs Les tableaux sont des valeurs, pas des pointeursimplicitescomme en C. Vouspouvezrécupérerl’adresse d’un tableau, attribuer un pointeur à un tableau (par exemple pour le passer efficacement sans recopie à unefonction) : func f(a [3]int) { fmt.Println(a) } funcfp(a *[3]int) { fmt.Println(a) } func main() { var ar [3] int f(ar) // passe une copie de ar fp(&ar) // passe un pointeur sur ar } Sortie(Print et consorsreconnaissent les tableaux): [0 0 0] &[0 0 0]

  7. Les litéraux tableau Tous les types composite ontunesyntaxesimilaire pour la création des valeurs. Pour les tableaux celaressemble à : Tableau de 3 entiers: [3]int{1, 2, 3} Tableau de 10 entiers, les trois premiers n’étant pas à zéro: [10]int{ 1, 2, 3} Vous ne voulez pas compter? Utilisez... pour la initialiser la longueur: [...]int{1, 2, 3} Vous ne voulez pas tous les initialiser? Utilisez les paireskey:value : [10]int{2:1, 3:1, 5:1, 7:1}

  8. Pointeurs sur des litéraux tableau Vouspouvezrécupérerl’adresse d’un litéral tableau afind’avoir un pointeursurune instance nouvellementcréée : funcfp(a *[3]int) { fmt.Println(a) } func main() { for i := 0; i < 3; i++ { fp(&[3]int{i, i*i, i*i*i}) } } Output: &[0 0 0] &[1 1 1] &[2 4 8]

  9. Les slices

  10. Les slices Une tranche (slice) estuneréférenceversune section d’une tableau. Les slices sonthabituellement plus utiliséesque des tableaux pleins. Une slice ne coute pas grand chose en place et performance (plus à venir). Un type slice ressemble à un type tableau sans la taille : var a []int La fonction native len(a) retourne le nombred’éléments de la tranche. On créeune slice en tranchant un tableau ouuneautre slice : a = ar[7:9] Les index valides de aserontalors 0 et 1; len(a)==2.

  11. Raccourcis pour les slices Quand on créeune slice, le premier index est par défaut à 0 : ar[:n] signifie ar[0:n]. Le second index est par défautlen(array/slice): ar[n:] signifie ar[n:len(ar)]. Enfin pour créerune slice d’un tableau : ar[:] signifie ar[0:len(ar)].

  12. Un slice référence un tableau Conceptually: type Slice struct { base *elemType // pointeursur le 0ème élément lenint // nb. d’élémentsdans la slice cap int // num. d’élémentsdisponibles } Array: ar: Slice: a=ar[7:9]:

  13. Construire une slice Les litéraux slice ressemblent à des litéraux tableau sans la taille : var slice = []int{1,2,3,4,5} Ce qui se passe, c’est la création d’un tableau de longueur 5 suivie de la créationd’une slice qui y fait référence. Nous pouvonségalementallouerune slice (et le tableau sous-jacent) avec la fonction native make : var s100 = make([]int, 100) // slice: 100 ints Pourquoimake et pas new? Parce nous avonsbesoin de fabriquerune slice et pas seulementd’allouer de la mémoire. Notezquemake([]int, 10)retourne []inttandisquenew([]int) retourne*[]int. Utilisezmake pour créer des slices, des maps, et des channels (plus tarddans le cours)

  14. La capacité d’une slice Une slice fait référence à un tableau sous-jacent, ainsiilpeut y avoir des éléments à l’exprémité de la slice qui sontprésentsdans le tableau. La fonction native cap (capacity) indiquejusqu’àquelletaille la slice pourrait encore grossirs’il le fallait. Après var ar = [10]int{0,1,2,3,4,5,6,7,8,9} var a = ar[5:7] // référence vers le sous-tableau{5,6} len(a)est 2 et cap(a)est 5. On peut "reslicer": a = a[0:4] // référence vers le sous-tableau {5,6,7,8} len(a)estdésormais 4 maiscap(a)esttoujours 5.

  15. Retailler une slice Les slices peuventêtreutilisées pour faire grossir un tableau. var sl = make([]int, 0, 100) // len 0, cap 100 funcappendToSlice(i int, sl []int) []int { if len(sl) == cap(sl) { error(...) } n := len(sl) sl = sl[0:n+1] // étendd’unelongueur de 1 sl[n] = i return sl } Ainsi la longueur de slesttoujours le nombred’élémentsmaisilgrossit avec le besoin. Ce style estléger et propre à Go.

  16. Les slices sont légères Sentezvouslibresd’allouer et de retailler des slices commevousl’entendez. Ellessontlégères; pas de besoind’allocation. Souvenez-vousquecesont des références, ainsi le stockagesous-jacentpeutêtremodifié. Par exemple, les I/O utilisent des slices, pas des compteurs: func Read(fdint, b []byte) int var buffer [100]byte for i := 0; i < 100; i++ { // remplit le buffer un octet à la fois Read(fd, buffer[i:i+1]) // pas d’allocationici } Scinder un buffer: header, data := buf[:n], buf[n:] Les chaînes de caractèrespeuventêtreslicéeségalement avec la mêmeefficacité.

  17. Les dictionnaires (maps)

  18. Les dictionnaires (Map) Les dictionnairessont un autre type de référence. Ilssontdéclarés de la façonsuivante : var m map[string]float64 Cecidéclare un dictionnaireindexé avec une clef de type string et unevaleur de type float64. C’est analogue à cequel’ontrouve en C++ type *map<string,float64> (note the *). Etantdonné un dictionnairem, len(m)retourne le nombre de clefs.

  19. Création d’un dictionnaire Comme avec une slice, une variable dictionnaire ne se réfère à rien; vousdevezmettrequelque chose dedans avant de l’utiliser. Trois façons de le faire : 1) Litéral: liste de clef:valeur m = map[string]float64{"1":1, "pi":3.1415} 2) Création m = make(map[string]float64) // makepas new 3) Affectation var m1 map[string]float64 m1 = m // m1 and m now refer to same map

  20. Indexation d’un dictionnaire (Les prochainsexemplesutilisenttous m = map[string]float64{"1":1, "pi":3.1415} ) Accède à un élémentcomme à unevaleur; si pas présente, renvoieunevaleur zéro : one := m["1"] zero := m["pas présent"] // mets zeroà 0.0. Stocke un élément : m["2"] = 2 m["2"] = 3

  21. Test de l’existence Pour tester siune clef estpésentedans un dictionnaire, nous pouvonsutiliserune affectation multiple, la forme “virgule ok(comma ok)” : m = map[string]float64{"1":1, "pi":3.1415} var value float64 var presentbool value, present = m[x] or idiomatiquement value, ok := m[x] // la forme "comma ok" Si x estprésentdans le dictionnaire, positionne le booléen à true et la valeur et récupère la valeurassocié à la clef donnée. Si non, positionne le booléen à false et renvoie la valeur zero pour le type considéré.

  22. Suppression La suppression d’une entrée se fait de la manièresuivante : m = map[string]float64{"1":1.0, "pi":3.1415} var keepbool var value float64 var x string = f() m[x] = v, keep Si keepest true, l’affectation de v dans le dictionnaire s’effectuebien; si keep est false, l’entrée du dictionnaire pour la clef x estsupprimée., m[x] = 0, false // supprime l’entrée // pour x

  23. For et range La boucle forpossèdeunesyntaxespécialedans le casd’une itérationsur un tableau, d’une slice ou d’un dictionnaire: m := map[string]float64{"1":1.0, "pi":3.1415} for key, value := range m { fmt.Printf("key %s, value %g\n", key, value) } S’iln’y a qu’uneseule variable, ne récupèreque la clef : for key = range m { fmt.Printf("key %s\n", key) } Les variables peuventêtreaffectéesoudéclarées en utilisant:=. Pour les tableaux et les slices, renvoiel’index et la valeur .

  24. Range sur une chaîne de caractères Un forutilisant un rangesurunechaîne boucle sur les points code Unicode, non sur les octets. (Utiliser []byte pour les octets, ouutiliser le for standard). La chaîneestconsidéréedevantcontenir des caractères en UTF-8. La boucle s := "[\u00ff\u754c]" for i, c := range s { fmt.Printf("%d:%q ", i, c) // %q for 'quoted' } affiche 0:'[' 1:'ÿ' 3:'􀖄' 6:']‘ Si un UTF-8 esterroné, le caractèreestmis à U+FFFD et l’indexavance d’un seul octet.

More Related