92 votes

Allez exemples et expressions idiomatiques

Il n’y a pas beaucoup de code aller pour apprendre la langue à partir, et je ne sais pas que je ne suis ne pas le seul expérimenter avec lui. Donc, si vous avez trouvé quelque chose d’intéressant au sujet de la langue, s’il vous plaît poster un exemple ici.

Je cherche aussi pour

  • idiomatiques façons de faire les choses dans Go,
  • Style C/C++ de la pensée « portée » to Go,
  • pièges communs sur la syntaxe,
  • quelque chose d’intéressant, vraiment.

35voto

György Andrasek Points 4332

Reporter états

Un "reporter" instruction appelle une fonction dont l'exécution est différée pour l'instant les environs de la fonction retourne.

DeferStmt = "reporter" de l'Expression .

L'expression doit être une fonction ou un appel de méthode. Chaque fois que le "reporter" exécution d'une instruction, les paramètres de l'appel de fonction sont évalués et enregistrés à nouveau, mais la fonction n'est pas appelée. Différés les appels de fonction sont exécutés dans l'ordre LIFO immédiatement avant l'entourant fonction retourne une valeur, mais après les valeurs de retour, le cas échéant, ont été évalués.


lock(l);
defer unlock(l);  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i);
}

Mise à jour:

defer est maintenant aussi le idiomatiques manière de manipuler panic dans une exception-comme manière:

package main

import "fmt"

func main() {
    f()
    fmt.Println("Returned normally from f.")
}

func f() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    fmt.Println("Calling g.")
    g(0)
    fmt.Println("Returned normally from g.")
}

func g(i int) {
    if i > 3 {
        fmt.Println("Panicking!")
        panic(fmt.Sprintf("%v", i))
    }
    defer fmt.Println("Defer in g", i)
    fmt.Println("Printing in g", i)
    g(i+1)
}

25voto

György Andrasek Points 4332

Aller à fichiers objets effectivement incluent un en-tête de texte en clair :

22voto

j-g-faustus Points 4315

J'ai vu un couple de personnes se plaindre de la boucle for, le long des lignes de "pourquoi devrions-nous avoir à dire i = 0; i < len; i++ dans cette journée et l'âge?".

Je suis en désaccord, je l'aime pour la construire. Vous pouvez utiliser la version longue si vous le souhaitez, mais la idiomatiques Aller est

var a = []int{1,2,3};
for i, v := range a {
  fmt.Println(i, v);
}

L' for .. range construire des boucles sur tous les éléments et fournit deux valeurs de l'indice i et la valeur v.

range travaille aussi sur des cartes et des canaux.

Encore, si vous n'aimez pas for dans n'importe quelle forme, vous pouvez définir each, map etc. en quelques lignes:

type IntArr []int

  // 'each' takes a function argument. 
  // The function must accept two ints, the index and value,
  // and will be called on each element in turn.
func (a IntArr) each(fn func(index, value int)) {
  for i, v := range a { fn(i, v); }
}

func main() {
  var a = IntArr([]int{2,0,0,9}); // create int slice and cast to IntArr
  var fnPrint = func (i, v int) { 
    fmt.Println(i, ":", v); 
  }; // create a function 

  a.each(fnPrint); // call on each element
}

imprime

0 : 2
1 : 0
2 : 0
3 : 9

Je commence à aimer Aller beaucoup :)

19voto

György Andrasek Points 4332

Voici un bel exemple d’iota du post de Kinopiko:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X