-1
votes

Quelle est la différence entre la déclaration de type et la définition de type à Golang?

DÉCLARATION DE TYPE:

type A string

go

4 commentaires

Moyenne lorsque j'utilise type A = String, une volonté se comportera exactement comme une chaîne, et peut faire des choses qui peuvent faire du type de chaîne sans aucun type de coulée, comme: - var p a = "SFSDF"; p + "sdfds" fonctionne? et dans la chaîne de type A, un nouveau type est créé ,?


Les deux formulaires sont déclarations de type , le 1er formulaire utilise "Déclaration d'alias", le 2e formulaire utilise "Définition de type".


play.golang.com/p/jdiill424d8


Les alias de type ne servent aucun but pendant la "programmation", il n'y a littéralement rien de ce qu'ils font. Ils deviennent utiles lors du refactoring à grande échelle du code. Vous trouverez le débat animé en ligne qui s'est passé avant leur introduction. Vous n'en avez essentiellement jamais besoin (et vous devriez pas les utiliser!) Jusqu'à ce que vous en avez besoin.


3 Réponses :


3
votes

type A = chaîne crée un alias pour chaîne . Chaque fois que vous utilisez A dans votre code, cela fonctionne comme string . Donc, par exemple, vous ne pouvez pas définir les méthodes sur elle.

Tapez une chaîne Définit un nouveau type, qui a la même représentation que chaîne . Vous pouvez convertir entre un A et (code> à zéro coût (car ils sont identiques), mais vous pouvez définir des méthodes sur votre nouveau type et que la réflexion saura sur le type. a .

par exemple (sur le ) xxx

sortie: xxx


5 commentaires

Alias ​​seulement pour compiler le temps? @ Paul-Hankin


Je ne crois pas qu'il y ait une représentation de l'alias dans les données de réflexion d'exécution, afin que cela puisse être considéré comme un alias de compilation. Est-ce que ça répond à votre question?


@Paulhankin En fait, vous pouvez définir des méthodes sur le type alias, vous ne pouvez tout simplement pas le faire dans ce cas particulier. S'il vous plaît, vois ma réponse


@Paulhankin ah, désolé, mal interprété. comme chaîne. Donc, par exemple, vous ne pouvez pas définir les méthodes sur celui-ci - Je suggérerais de reformuler cela pour plus de clarté.


@Grigoriymikhalkin ou vous pouvez dire que vous ne pouvez pas définir des méthodes sur l'alias de type, mais vous pouvez parfois définir des méthodes sur le type d'origine à l'aide de l'alias. Je pense que ce que j'ai écrit est précis (et utile dans le contexte de la question), mais je conviens que cela ne couvre pas tous les cas de bord.



3
votes

Le formulaire type A = chaîne crée un alias entre les deux, ils ne peuvent pas être étendus à ce stade. À quoi cela résoudra-t-il? Eh bien, pour Golang, ils aident à certaines choses comme le refactoring et la réparation de CodeBase et il y a un excellent article à ce sujet ici: https://talks.golang.org/2016/refactor.article .

La définition de type vous permet d'étendre un type avec un comportement supplémentaire si vous en avez besoin, ceci sera généralement celui qui est le plus utile en tant que développeur lorsque vous souhaitez créer des types de données personnalisés à partir de types de données de base.


0 commentaires

3
votes

Pour être clair sur les termes, ces deux sont Type déclarations .

type A struct {}

func (A) print() {
    fmt.Println("A")
}

type B A

func (B) print() {
    fmt.Println("B")
}

func main() {
    a := A{}
    b := B{}

    a.print()  // OUTPUT: A
    b.print()  // OUTPUT: B
}


0 commentaires