Golang 10 : Les tableaux

in #utopian-io7 years ago

Les tableaux

image.png

Les tableaux sont une collection d'éléments qui appartiennent au même type, Par exemple une collection d'entiers 3, 5, 2, 6 d'un tableau. Les tableaux en Go ne tolèrent pas le mélange des types dans le même tableau.

Declaration

Un tableau n[T]. n indique le nombre d'éléments et T représente le type de chaque élément. Le nombre d'éléments n fait aussi partie du type.

Il y'a plusieurs façons possibles pour déclarer les tableaux. Voici un exemple:

package main

import (  
    "fmt"
)


func main() {  
    var a [3]int //tableau d'entiers de longueur 3
    fmt.Println(a)
}

var a[3]int déclare un tableau d'entiers de longueur 4. La valeur zéro du type de tableau est affectée automatiquement à tous les éléments du tableau . Dans ce cas, le zéro du type int est 0. Si on exécute le programme ci-dessus, on va avoir comme sortie du programme [0 0 0].

L'indice d'un tableau commence de 0 et termine à length -1. On va attribuer quelques valeurs aux éléments du tableau comme suivant:

package main

import (  
    "fmt"
)


func main() {  
    var a [3]int //tableau d'entiers de longueur 3
    a[0] = 23 // l'indice du tableau commence par 0
    a[1] = 67
    a[2] = 29
    fmt.Println(a)
}

La sortie du programme est[23 67 29]

On va créer le même tableau en utilisant une déclaration plus concise:

package main 

import (  
    "fmt"
)

func main() {  
    a := [3]int{23, 67, 29} //déclaration concise pour créer un tableau
    fmt.Println(a)
}

Il n'est pas nécessaire d'affecter des valeurs à tous les éléments du tableau durant la déclaration concise.

package main

import (  
    "fmt"
)

func main() {  
    a := [3]int{12} 
    fmt.Println(a)
}

La longueur du tableau est déclarée mais uniquement une seule valeur est fournie, on affecte automatiquement zéro aux autres éléments du tableau.

On peut aussi ignorer la longueur d'un tableau dans la déclaration et remplacer la longueur par afin que le compilateur trouve la longueur du tableau.

Exemple:

package main

import (  
    "fmt"
)

func main() {  
    a := [...]int{12, 78, 50} // ... indique au compilateur qu'il faut chercher la longueur du tableau
    fmt.Println(a)

La taille du tableau fait partie du type. Par conséquent [3]int et [34] sont deux types différents. C'est la raison pour laquelle la taille d'un tableau ne peut pas être modifiée.

gpackage main

func main() {  
    a := [3]int{5, 78, 8}
    var b [5]int
  b = a // affectation impossible car [3]int et [5]int n'ont pas le même type
}

Une erreur de compilation serait lancée : main.go:6: cannot use a (type [3]int) as type [5]int in assignment.

Les tableaux sont des types de valeurs

Les tableaux en Go sont des types de valeur et non pas des types de référence. Cela veut dire que quand ils sont affectés à une nouvelle variable, une copie du tableau original est affectée à la nouvelle variable. Si des changements touchent la nouvelle variable, cela ne va pas être reflété dans le tableau original.

package main

import "fmt"

func main() {  
    a := [...]string{"USA", "China", "India", "Germany", "France"}
    b := a // un copie de  a est attribuée à b
    b[0] = "Singapore"
    fmt.Println("a is ", a)
    fmt.Println("b is ", b) 
}

La sortie du programme serait comme suivant:

a is [USA China India Germany France]  
b is [Singapore China India Germany France]

Idem quand les tableaux sont passés à des fonctions comme paramètres , ils sont passés par valeur et le tableau original reste intacte.

package main

import "fmt"

func changeLocal(num [5]int) {  
    num[0] = 55
    fmt.Println("dans la fonction ", num)

}
func main() {  
    num := [...]int{5, 6, 7, 8, 8}
    fmt.Println("avant de passer le tableau à la fonction ", num)
    changeLocal(num) //num is passed by value
    fmt.Println(" après avoir passé la tableau à la fonction", num)
}

Dans le programme ci-dessus, le tableau num est passé par valeur à la fonction changeLocal, par conséquent, il ne va pas changer à cause de l'appel de la fonction. La sortie de ce programme est:

avant de passer le tableau à la fonction [5 6 7 8 8]  
dans la fonction [55 6 7 8 8]  
après avoir passé la tableau à la fonction [5 6 7 8 8]  

La longueur d'un tableau

La longueur d'un tableau est trouvée en passant le tableau comme paramètre à la fonction len.

package main

import "fmt"

func main() {  
    a := [...]float64{67.7, 89.8, 21, 78}
    fmt.Println("la longueur est",len(a))

}

La sortie du programme ci-dessus est longueur est 4.

Itération d'un tableau range

La boucle for peut être utilisée pour itérer sur tous les éléments d'un tableau.

package main

import "fmt"

func main() {  
    a := [...]float64{67.7, 89.8, 21, 78}
    for i := 0; i < len(a); i++ { //bouclage de 0 à la longeur du tableau
        fmt.Printf("%d ème element de a est %.2f\n", i, a[i])
    }
}

le résultat du programme serait comme suivant:

0 ème element de a is 67.70  
1 ème element de a is 89.80  
2 ème element de a is 21.00  
3 ème element de a is 78.00 

On peut avoir le même résultat en utilisant range:

package main

import "fmt"

func main() {  
    a := [...]float64{67.7, 89.8, 21, 78}
    sum := float64(0)
    for i, v := range a {//range retourne l'indice et la valeur 
        fmt.Printf("%d ème element de a est %.2f\n", i, v)
        sum += v
    }
    fmt.Println("\n somme de tous les éléments de a est ",sum)
}

Si vous voulez uniquement avoir la valeur du tableau sans son indice, on peut remplacer l'indice par _ comme suivant:

for _, v := range a { //ignore l'indice  
}

Les tableaux multidimensionnels

On peut créer des tableaux multidimensionnels comme suivant:

package main

import (  
    "fmt"
)

func printarray(a [3][2]string) {  
    for _, v1 := range a {
        for _, v2 := range v1 {
            fmt.Printf("%s ", v2)
        }
        fmt.Printf("\n")
    }
}

func main() {  
    a := [3][2]string{
        {"jaune", "rouge"},
        {"vert", "mauve"},
        {"noir", "blanc"}, //la virgule est importante pour que le compilateur ne lance pas un message d'erreur
    }
    printarray(a)
    var b [3][2]string
    b[0][0] = "prada"
    b[0][1] = "lacoste"
    b[1][0] = "louboutin"
    b[1][1] = "gucci"
    b[2][0] = "dolce&gabanna"
    b[2][1] = "louis vuiton"
    fmt.Printf("\n")
    printarray(b)
}

après l'exécution du programme, on aura comme sortie:

jaune rouge
vert mauve
noir blac
prada lacoste
louboutin gucci
dolce&gabanna louis vuiton



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Thank you for the contribution. It has been approved.

You can contact us on Discord.
[utopian-moderator]

Hey @raptorjesus I am @utopian-io. I have just upvoted you!

Achievements

  • You have less than 500 followers. Just gave you a gift to help you succeed!
  • Seems like you contribute quite often. AMAZING!

Suggestions

  • Contribute more often to get higher and higher rewards. I wish to see you often!
  • Work on your followers to increase the votes/rewards. I follow what humans do and my vote is mainly based on that. Good luck!

Get Noticed!

  • Did you know project owners can manually vote with their own voting power or by voting power delegated to their projects? Ask the project owner to review your contributions!

Community-Driven Witness!

I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!

mooncryption-utopian-witness-gif

Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x