2016-07-29 9 views
0

Es ist ein Stück GO Code Ich habe in der GIN-Bibliothek und in der Google Text & Tabellen zu sehen, die Golang godoc - Gruppentyp Erklärungen Erklären

type (
    T0 []string 
    T1 []string 
    T2 struct{ a, b int } 
    T3 struct{ a, c int } 
    T4 func(int, float64) *T0 
    T5 func(x int, y float64) *[]string 
) 

wie folgt aussehen

Was ich nicht verstehe ist, was diese Gruppierung tut und was sind einige Zwecke dieser Umsetzung (es gab in der Dokumentation nicht viel, die über dieses Thema ging es sei denn ich es verpasst)

ein weiteres Beispiel aus der Gin Bibliothek

type (
    RoutesInfo []RouteInfo 
    RouteInfo struct { 
     Method string 
     Path string 
     Handler string 
    } 
     Engine struct { 
     RouterGroup 
     HTMLRender render.HTMLRender 
     allNoRoute HandlersChain 
     allNoMethod HandlersChain 
     noRoute  HandlersChain 
     noMethod HandlersChain 
     pool  sync.Pool 
     trees  methodTrees 

     RedirectTrailingSlash bool 


     RedirectFixedPath bool  
     HandleMethodNotAllowed bool 
     ForwardedByClientIP bool 
    } 
) 

Und schließlich - sorry das andere Thema ist aber im Zusammenhang mit diesem

var _ IRouter = &Engine{} 

warum gibt es ein _ infront IRouter? Ich weiß, es ist ein blank identifier aber welcher Zweck es in diesem Fall wird

+0

In Bezug auf das erste Codebeispiel ist es Zweck, Typdeklarationen zu demonstrieren, die Ihnen helfen, benannte und unbenannte Typdeklarationen zu verstehen. Anstatt beispielsweise '[] string' zu schreiben, können Sie stattdessen' T0' oder 'T1' schreiben. Interessanterweise werden 'T0' und' T1' aufgrund ihrer Namen als unterschiedlich angesehen. Empfehlen Sie die Überprüfung [Typidentität] (https://golang.org/ref/spec#Type_identity) –

+0

Nachdem ich das gelesen habe (was ich im oberen Teil geschrieben habe) sehe ich keine Erklärung für den Anon-Typ. Da es 'type()' ist und der Typ andere types + structs kapseln/gruppieren kann, was macht das für eine Datenstruktur und wie hilft es? take of instance die ersten beiden Zeilen von 'RoutesInfo [] RouteInfo' und' RouteInfo struct {} 'warum ist es innerhalb des type() statt einer' var RoutesInfo [] RouteInfo' und einer anderen Deklaration wie 'type RouteInfo struct {} 'und eine andere Zeile für' type Engine struct {} ' – Andrei

+0

Ich glaube, du verstehst das, was du siehst - nichts davon (außer der letzten' var _' Zeile, die du eingefügt hast) sind variable Deklarationen. Sie sind nur Typ-Deklarationen. Die Verwendung von 'type (...)' ist nur eine Kurzform für das Schreiben von 'type' am Anfang jeder Zeile. Es ist nur eine Syntax-Sache - sie haben die gleiche Bedeutung. – joshlf

Antwort

2

Der Code

type (
    A int 
    B string 
) 

ist Funktionalität identisch mit

type A int 
type B string 

Die Gruppierung hat nur eine Möglichkeit, Code zu organisieren. Die Gruppierung wird manchmal verwendet, um anzuzeigen, dass die Typen in irgendeiner Weise verwandt sind.

Die Verwendung der leeren Kennung wird unter Specs: What's the purpose of the blank identifier in variable assignment? erläutert.

1

Ich denke, der erste Teil Ihrer Frage wurde bereits beantwortet. Was den zweiten Teil, der Code

var _ IRouter = &Engine{} 

Erzeugt eine Kompilierung-Check, dass *Engine implementiert die IRouter Schnittstelle. Wir weisen einer Variablen, die vom Typ IRouter sein muss, einen Wert vom Typ *Engine zu. Wenn eine *Engine die Schnittstelle nicht erfüllt, wird sie nicht kompiliert.

Dies ist nicht unbedingt notwendig, aber manche Leute setzen es gerne dort ein, wo sie einen Typ definieren, um sicherzustellen, dass sie immer eine beabsichtigte Schnittstelle erfüllt.

0

In Bezug auf 1. Frage

Die gezeigten statments Typdeklaration Von der Go Sprache spec sind: Eine Typdeklaration bindet eine Kennung, die Typenbezeichnung, auf eine neue Art, die den gleichen zugrunde liegenden Typ als eine bestehende Typ hat Außerdem werden für den vorhandenen Typ definierte Operationen für den neuen Typ definiert. Der neue Typ unterscheidet sich vom vorhandenen Typ.

TypeDecl = "Typ" (TypeSpec | "(" {TypeSpec ";"} ")"). TypeSpec = Bezeichner Typ.

In Laiebezeichnungen können Sie tun:

Typ

z.B.

type Temperature uint8 
type WeekTemp [7]Temperature 

Für zugrunde liegenden Typ, Benannte Instanzen der boolean, numerischen und String-Typen sind vordeklariert. Composite-Typen aufgebaut sind, unter Verwendung von Typ-Literale

TypeLiteral = arraytype | StructType | ZeigerTyp | Funktionstyp | SchnittstelleTyp | Schnitttyp | MapType | Kanaltyp.

so können Sie auch in äquivalenter Weise tun:

type (
    Temperature unit8 
    WeekTemp [7]Temperature 
) 

ein weiteres Beispiel für Verbundtyp

type Tree struct { 
    leftChild, rightChild *Tree 
} 

Für zweite Frage,

Editiert: ich nicht bewusst war aber anprobieren Spielplatz, es sieht aus wie die Antwort von jcbwlkr ist in der Tat richtig.

versucht So

type MyInterface interface{ 
    someMethod() 
} 
type MyType struct{} 
var _ MyInterface = &MyType{} 

kompilieren wird dieser Fehler geben

nicht MyType wörtliche (Typ * MyType) als Typ MyInterface in Zuordnung verwenden: * MyType nicht implementiert MyInterface (fehlende someMethod Methode)

So ist es in der Tat eine Kompilierzeit überprüfen, um sicherzustellen, dass Diese Engine-Struktur entspricht der IRouter-Schnittstelle. Ordentlich