Introduction au go defer (fonction go delay)
Le report du langage Go
Go est considéré comme une nouvelle fonctionnalité du langage, du moins par rapport aux langages de programmation traditionnels d'aujourd'hui.
L'instruction defer appelle une fonction. L'exécution de cette fonction sera reportée jusqu'au retour de la fonction périphérique, ou jusqu'à la fin de la fonction périphérique, ou jusqu'à ce que la goroutine correspondante panique
Chaque fois que defer est utilisé. exécuté, il La valeur de la fonction suivante (dans Go, la fonction est un type de référence, un citoyen de première classe et peut être affectée à une variable) et les paramètres de la fonction seront évalués, mais la fonction ne sera appelée immédiatement que (↑ ), les trois situations ci-dessus se produisent. C'est tout le contenu de defer, disparu, le reste est la meilleure pratique de defer
La fonction ne sera pas appelée immédiatement
Commençons par la plus simple :
func readFile(fileName string){ f,err := os.Open(fileName) if err!=nil { return } defer f.Close() var content [1024]byte f.Read(content[:]) fmt.Printf("%s",content) } func main() { readFile("test.data") }
Le programme génère les 1024 premiers octets de test.data. Il convient de mentionner que les opérations de couplage ouverture/fermeture comme celle-ci sont l'usage idiomatique du report. Cet exemple explique la seconde moitié de la phrase ci-dessus
"Mais la fonction ne sera pas appelée"
Parce que si f.Close() après le defer n'est pas retardé, alors le descripteur de fichier S'ils sont tous fermés, rien ne sera lu.
La valeur de la fonction et les paramètres de la fonction sont évalués, mais la fonction n'est pas appelée immédiatement
L'exemple suivant expliquera la première moitié, il vient de <> , légèrement Modification :
func trace(funcName string) func(){ start := time.Now() fmt.Printf("function %s enter\n",funcName) return func(){ log.Printf("function %s exit (elapsed %s)",funcName,time.Since(start)) } } func foo(){ defer trace("foo()")() time.Sleep(5*time.Second) } func main(){ foo() foo() } /* OUTPUT: function foo() enter function foo() exit (elapsed 5.0095471s) function foo() enter function foo() exit (elapsed 5.0005382s) */
Pourquoi la sortie foo entre-t-elle puis attend-elle environ cinq secondes avant de sortir la sortie Parce que comme nous l'avons dit, les valeurs et les paramètres de la fonction après
defer seront évalués ? mais la fonction réelle L'appel doit attendre la fin
La valeur de la fonction ici est la fonction anonyme renvoyée par trace(). Le paramètre de la fonction est bien sûr la valeur littérale de la chaîne "foo()". de trace("foo()") la fonction de sortie foo() entrera, l'appel de fonction réel trace("foo()")(), c'est-à-dire que la fonction de sortie foo() exit(elapsed x.x) sera reportée à return exécution (si return mettra à jour la variable de valeur de retour, elle sera exécutée après la mise à jour avant d'exécuter la fonction defer).
Divers
Un petit plus, s'il y a plusieurs instructions defer, l'ordre d'exécution de la dernière fonction defer est opposé à l'ordre dans lequel defer apparaît, comme par exemple :
func main() { func1 := func(){ fmt.Println("func1() execution deferred") } func2 := func(){ fmt.Println("func2() execution deferred") } defer func1() defer func2() fmt.Println("strat\nworking...") } /* OUTPUT: strat working... func2() execution deferred func1() execution deferred */
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Dans Go, les messages WebSocket peuvent être envoyés à l'aide du package gorilla/websocket. Étapes spécifiques : Établissez une connexion WebSocket. Envoyer un message texte : appelez WriteMessage(websocket.TextMessage,[]byte("message")). Envoyez un message binaire : appelez WriteMessage(websocket.BinaryMessage,[]byte{1,2,3}).

Dans Go, le cycle de vie de la fonction comprend la définition, le chargement, la liaison, l'initialisation, l'appel et le retour ; la portée des variables est divisée en niveau de fonction et au niveau du bloc. Les variables d'une fonction sont visibles en interne, tandis que les variables d'un bloc ne sont visibles que dans le bloc. .

Dans Go, vous pouvez utiliser des expressions régulières pour faire correspondre les horodatages : compilez une chaîne d'expression régulière, telle que celle utilisée pour faire correspondre les horodatages ISO8601 : ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Utilisez la fonction regexp.MatchString pour vérifier si une chaîne correspond à une expression régulière.

Go et le langage Go sont des entités différentes avec des caractéristiques différentes. Go (également connu sous le nom de Golang) est connu pour sa concurrence, sa vitesse de compilation rapide, sa gestion de la mémoire et ses avantages multiplateformes. Les inconvénients du langage Go incluent un écosystème moins riche que les autres langages, une syntaxe plus stricte et un manque de typage dynamique.

Les fuites de mémoire peuvent entraîner une augmentation continue de la mémoire du programme Go en : fermant les ressources qui ne sont plus utilisées, telles que les fichiers, les connexions réseau et les connexions à la base de données. Utilisez des références faibles pour éviter les fuites de mémoire et ciblez les objets pour le garbage collection lorsqu'ils ne sont plus fortement référencés. En utilisant go coroutine, la mémoire de la pile de coroutines sera automatiquement libérée à la sortie pour éviter les fuites de mémoire.

Consultez la documentation de la fonction Go à l'aide de l'EDI : passez le curseur sur le nom de la fonction. Appuyez sur la touche de raccourci (GoLand : Ctrl+Q ; VSCode : Après avoir installé GoExtensionPack, F1 et sélectionnez « Go:ShowDocumentation »).

Les tests unitaires des fonctions simultanées sont essentiels car cela permet de garantir leur comportement correct dans un environnement simultané. Des principes fondamentaux tels que l'exclusion mutuelle, la synchronisation et l'isolement doivent être pris en compte lors du test de fonctions concurrentes. Les fonctions simultanées peuvent être testées unitairement en simulant, en testant les conditions de concurrence et en vérifiant les résultats.

Lors du passage d'une carte à une fonction dans Go, une copie sera créée par défaut et les modifications apportées à la copie n'affecteront pas la carte d'origine. Si vous devez modifier la carte originale, vous pouvez la passer via un pointeur. Les cartes vides doivent être manipulées avec précaution, car ce sont techniquement des pointeurs nuls, et passer une carte vide à une fonction qui attend une carte non vide provoquera une erreur.
