Maison  >  Article  >  développement back-end  >  Quand Go renvoie-t-il une valeur, renvoie-t-il une référence ou ne renvoie-t-il rien ?

Quand Go renvoie-t-il une valeur, renvoie-t-il une référence ou ne renvoie-t-il rien ?

王林
王林avant
2024-02-05 23:24:031024parcourir

Quand Go renvoie-t-il une valeur, renvoie-t-il une référence ou ne renvoie-t-il rien ?

Contenu de la question

J'écris du code dans lequel un certain nombre de fonctions mettent à jour des éléments qui sont "passés par référence", dans le sens de DoSomethingB ci-dessous. En tant que débutant, cela me semble plutôt peu intuitif. Je préfère qu'une fonction renvoie son résultat (sauf s'il s'agit d'une méthode et met à jour le récepteur).

Question :

  1. Y a-t-il un bon argument pour utiliser des modèles comme DoSomethingB Par DoSomethingA ?
  2. est DoSomethingB (pas une méthode struct) Est-ce considéré comme un style bon ou acceptable au Go ?
package main

import (
    "fmt"
)

func DoSomethingA(someData int) int {
    return someData + 23
}

func DoSomethingB(someData *int) {
    *someData = *someData + 23
}

func DoSomethingC(someData *int) *int {
    tmp := *someData + 23
    return &tmp
}

func main() {
    someDataA := 19
    someDataB := 19
    someDataC := 19
    
    fmt.Printf("1) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC)
    
    someDataA = DoSomethingA(someDataA)
    DoSomethingB(&someDataB)
    someDataC = *DoSomethingC(&someDataC)
    
    fmt.Printf("2) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC)
}

Allez sur le lien Playground : https://play.golang.com/p/ELwljCaWDLg


Correct Answer


Bien sûr, décomposons votre question :

  1. DoSomethingB vs DoSomethingA : Utiliser un modèle comme DoSomethingB 这样的模式会很有帮助,从而避免不必要的分配。但是,它可能会导致代码更难理解。使用 DoSomethingA est utile si vous souhaitez modifier la variable d'origine sans créer de copie, évitant ainsi les allocations inutiles. Cependant, cela peut rendre le code plus difficile à comprendre. L'utilisation de

    (résultat renvoyé) est généralement plus idiomatique en Go et est souvent préférée pour des raisons de lisibilité.
  2. DoSomethingB est-il considéré comme un bon style au Go ? DoSomethingB : Bien qu'il ne soit pas rare de voir du code comme

    dans Go, en particulier lorsqu'il s'agit de grandes structures de données, l'approche idiomatique de Go encourage les valeurs de retour pour modifier les pointeurs. L'utilisation de pointeurs pour modifier directement les valeurs (en particulier pour les types intégrés tels que les entiers) peut conduire à un code difficile à comprendre.

DoSomethingCExemple

serait considéré comme agrammatical car il renvoie un pointeur vers une variable locale. Cela peut conduire à un comportement indéfini car l'emplacement mémoire peut être réutilisé à d'autres fins après le retour de la fonction. Il est préférable d'éviter ce modèle.

DoSomethingA 这样的模式。如果您有充分的理由修改原始数据并且担心性能(例如大型数据结构),那么 DoSomethingBEn résumé, si vous souhaitez suivre le Go idiomatique, préférez

ce schéma. Si vous avez une bonne raison de modifier les données d'origine et que vous vous inquiétez des performances (par exemple de grandes structures de données), alors 🎜 est acceptable. 🎜

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer