Maison  >  Article  >  développement back-end  >  Types variables de paramètres d'entrée dans les fonctions

Types variables de paramètres d'entrée dans les fonctions

WBOY
WBOYavant
2024-02-09 20:54:10644parcourir

Types variables de paramètres dentrée dans les fonctions

Éditeur PHP Apple vous présente les types variables de paramètres d'entrée dans les fonctions. En PHP, les types de paramètres des fonctions peuvent être fixes ou variables. Les paramètres de type variable signifient que la fonction peut accepter différents types de paramètres en entrée, ce qui est très utile pour traiter les données dans différents scénarios. Nous pouvons déclarer des paramètres variadiques dans les définitions de fonctions en utilisant des identifiants de paramètres spéciaux tels que "...". Cela nous permet de gérer différents types de données de manière plus flexible et améliore la réutilisabilité et la lisibilité du code. Qu'il s'agisse de chaînes, de nombres, de tableaux ou d'autres types, nous pouvons facilement les transmettre en tant que paramètres aux fonctions et les traiter en conséquence dans la fonction. Cette manière flexible de gérer les types de paramètres rend notre code plus robuste et adaptable, capable de faire face à divers besoins métiers complexes.

Contenu de la question

J'ai créé une fonction pour obtenir le dernier commentaire d'un utilisateur sur une pull request. J'utilise le package "github.com/google/go-github/github". Je souhaite l'utiliser pour les types []*github.issuecomment et []*github.pullrequestcomment. Existe-t-il un moyen de rendre le type du paramètre d'entrée mutable afin de ne pas avoir à le spécifier dans la définition de la fonction et de pouvoir appeler la fonction avec l'un ou l'autre type ?

func getlastuserinteractionpr(comments_array *github.issuecomment or *github.pullrequestcomment)(*github.issuecomment or *github.pullrequestcomment) {
}

Utilisation de génériques :

func getlastuserinteractionpr(comments_array any)(any) {
}

Il s'agit d'une solution d'urgence puisque tout le projet sur lequel je travaille est écrit en go 1.14 et cette fonctionnalité est disponible à partir de go 1.18

Quand j'essaie d'utiliser une interface vide {} comme type d'entrée :

func getLastUserInteractionPRIssue(comments_array interface{})(*github.IssueComment) {

comments_array []*github.IssueComment(comments_array); err {
fmt.Println("success")
    } else {
        fmt.Println("failure")
    }
}

Solution

Vous souciez-vous de la structure interne de par exemple ? issuecomment ?

type issuecomment struct {
    id        *int64     `json:"id,omitempty"`
    nodeid    *string    `json:"node_id,omitempty"`
    body      *string    `json:"body,omitempty"`
    user      *user      `json:"user,omitempty"`
    reactions *reactions `json:"reactions,omitempty"`
    createdat *time.time `json:"created_at,omitempty"`
    updatedat *time.time `json:"updated_at,omitempty"`
    // authorassociation is the comment author's relationship to the issue's repository.
    // possible values are "collaborator", "contributor", "first_timer", "first_time_contributor", "member", "owner", or "none".
    authorassociation *string `json:"author_association,omitempty"`
    url               *string `json:"url,omitempty"`
    htmlurl           *string `json:"html_url,omitempty"`
    issueurl          *string `json:"issue_url,omitempty"`
}

Par exemple, souhaitez-vous en extraire certains champs spécifiques ? pullrequestcomment est une structure plus grande (elle a plus de champs), vous souciez-vous d'en extraire certains champs ?

Ou voulez-vous simplement la représentation sous forme de chaîne de chacun ? Ce que vous faites dépend en grande partie de ce que vous voulez faire avec la valeur transmise.

Si vous souhaitez juste une tranche de chaque string 表示,您可以使用极端(老实说,不是很安全 - 我不推荐这个)示例,让您的函数接受 fmt.stringer objet : p>

func dostuffwithstringifiedcomments(cs []fmt.stringer) {
  // both issuecomment and pullrequestcomment provide string()
  // methods and therefore implement fmt.stringer
  for _, comment := range cs {
    dosomethingwith(comment.string())
  }
}

Vos tranches peuvent désormais contenir des objets de n'importe quel type sans qu'aucune explosion ne se produise. Inconvénient : il peut également contenir des milliards d’autres types, dont aucun ne correspond à ce que vous souhaitez. Vous devez donc ajouter une vérification d'assertion de type :

switch t := comment.(type) {
  case github.issuecomment:
    // do good stuff
  case github.pullrequestcomment:
    // do other good stuff
  default:
    // yell and scream about the value of t
}

Si vous souhaitez extraire certains champs, vous devez composer une fonction qui prend quelque chose comme []interface{} (l'intégrer à l'interface vide, au lieu de l'interface vide représente une tranche), parcourir dessus et taper chaque élément du slice Vérifiez et extrayez tous les champs qui ont du sens, à condition que l'élément soit du type attendu :

func DoStuff(comments []interface{}) error {
  for _, c : = range comments {
    if ic, ok := c.(*github.IssueComment); ok { // Remove the deref if your slice contains values, not references
      // Pull out fields and do IssueComment-specific things
      ProcessIssueComment(ic)
    } else if prc, ok := c.(*github.PullRequestComment); ok {
      // Do PRComment-specific things
      ProcessPullRequestComment(prc)
    } else {
      return(fmt.Errorf("I did not want something of type %s", t))
    }
  }
  return nil
}

Aussi : faites pression sur le propriétaire du projet (si ce n'est pas vous) pour qu'il migre vers la version actuelle de go. La version 1.14 n'est sortie qu'en 2020, mais c'est une éternité pour une version Go.

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