Maison  >  Article  >  développement back-end  >  Créer une structure GO uniquement si certaines conditions sont remplies

Créer une structure GO uniquement si certaines conditions sont remplies

WBOY
WBOYavant
2024-02-08 21:05:49989parcourir

仅当满足特定条件时才创建 GO 结构

L'éditeur PHP Zimo vous présentera une fonctionnalité importante, qui est la création de structures GO dans des conditions spécifiques. Cette fonctionnalité nous permet de déterminer s'il convient de créer une structure GO selon les besoins, améliorant ainsi l'efficacité et les performances du programme. En utilisant cette fonctionnalité de manière rationnelle, nous pouvons éviter la création inutile de structures GO, réduire l'utilisation de la mémoire et la pression du garbage collection et améliorer l'efficacité d'exécution du programme. Dans cet article, nous détaillerons comment utiliser cette fonctionnalité et donnerons quelques exemples d’applications pratiques.

Contenu de la question

Mon extrait de code go est le suivant :

type mystruct struct {
   a int
}

if a == nil {
        cond = 0
        var a_mystruct_obj mystruct  // if this condition is satified then only create this a_mystruct_obj obj
    } else if b == nil {
        cond = 1
        var b_mystruct_obj mystruct  // if this condition is satified then only create this b_mystruct_obj obj

    } else {
        cond = 2 // // if this condition is satified then create both the above structure objects  a_mystruct_obj & b_mystruct_obj.
         // is having the below declaration again in else a valid go code ?
        var a_mystruct_obj mystruct
        var b_mystruct_obj mystruct
    }

J'ai une formation en C++. Ce serait facile en C++. Y a-t-il une allocation dynamique de mémoire en cours ? Comment puis-je y parvenir ?

Est-ce que déclarer à nouveau 2 dans un autre code go valide ?

var A_mystruct_obj MyStruct
    var B_mystruct_obj MyStruct

Ou dois-je avoir une sorte de polymorphisme d'exécution ici.

Mise à jour :

J'ai essayé de faire cela mais cela n'a même pas été compilé comme prévu.

https://go.dev/play/p/ioq81aexgjn

à nouveau mis à jour

J'ai essayé ceci et cela semble fonctionner. Est-ce correct?

https://go.dev/play/p/r_ywzmkgrps


Bonne réponse


Il y a deux problèmes dans votre code :

  1. Vos variables sont déclarées dans une portée englobante, elles ne sont donc pas accessibles depuis l'extérieur de cette portée (clause if/else)
  2. Vos variables sont déclarées comme valeurs

Lorsque vous résolvez le premier problème, qui consiste à déplacer la déclaration de variable vers l'accès au code après l'instruction if 子句范围之外,以使它们可以被 if :

    var a_mystruct_obj mystruct
    var b_mystruct_obj mystruct
    if a == nil {
        cond = 0
        // initialise a_mystruct
    } else if b == nil {
        cond = 1
        // initialise b_mystruct
    } else {
        cond = 2
        // initialise a_mystruct and b_mystruct
    }

Maintenant, les deux variables sont déclarées et les deux variables utilisent quelle clause dans l'instruction mystruct 进行初始化,无论到达 if nouvellement attribuée.

Pour résoudre ce problème, changez la variable en pointeur et attribuez la valeur souhaitée dans la branche correspondante de l'instruction if :

    var a_mystruct_obj *mystruct
    var b_mystruct_obj *mystruct
    if a == nil {
        cond = 0
        a_mystruct_obj = &mystruct{}
    } else if b == nil {
        cond = 1
        b_mystruct_obj = &mystruct{}
    } else {
        cond = 2
        a_mystruct_obj = &mystruct{}
        b_mystruct_obj = &mystruct{}
    }

Astuce bonus : futur vous vous remerciera d'avoir refactorisé cela en une paire d'instructions, déterminera si vous avez besoin de a ou b ou des deux, puis simplifiera votre L'instruction composée ab 或两者,然后简化您的复合 if 语句作为两个单独语句,分别初始化 ab agit comme deux

instructions

distinctes, initialisant respectivement a ou b :

    var A_mystruct_obj *MyStruct
    var B_mystruct_obj *MyStruct

    areq := a == nil || (..condition 2..) 
    breq := b == nil || (..condition 2..) 
    if areq {
        A_mystruct_obj = &MyStruct{}
    }
    if breq {
        B_mystruct_obj = &MyStruct{}
    }
Le but est d’éviter les duplications logiques (principe sec : a 和/或 b 是否需要的问题与初始化 abNe vous répétez pas

) et la séparation des préoccupations. Autrement dit, séparez la question de savoir quand

est nécessaire. em> Obligatoire. condition 2

Remarque : Il n'est pas possible d'être plus précis sur la façon d'exprimer 🎜 car le code que vous avez publié ne précise pas quelle est la condition. 🎜

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