2016-09-27 2 views
1

Sorry für den mehrdeutigen Titel sein sollte. Ich bekomme keinen Compilerfehler, wenn ich glaube, dass ich basierend auf dem Erstellen eines neuen Typs und einer Funktion, die ein Argument dieses Typs verwendet, sollte.Go Typ automatisch konvertieren, wenn es scheint, dass es nicht

Das Beispiel:

package search 

//Some random type alias 
type Search string 

//Takes a string and returns Search 
func NewSearch(s string) Search { 
    return Search(s) 
} 

//This is where things are getting weird 
//Returns an int just for arbitrary testing 
func PrintSearch(s Search) int{ 
    return 5 
} 

Nun wäre meine Vermutung sein, wenn ich ein Objekt mit NewSearch erstellt, würde ich in der Lage sein, es zu Druckensuche weitergeben und alles wie erwartet laufen, aber wenn übergebe ich Druckensuche eine primitive Zeichenfolge, sollte es nicht kompilieren. Ich erlebe dieses Verhalten nicht.

Der Hauptcode:

package main 
import (
    "fmt" 
    ".../search" //no need to type the whole path here 
) 

func main() { 
    SearchTerm := search.NewSearch("Test") 
    StringTerm := "Another test" 

    fmt.Println(search.PrintSearch(SearchTerm)) // This should print 5 
    fmt.Println(search.PrintSearch(StringTerm)) // This should throw a compiler error, but it is not 
} 

Es scheint, wie wenn ich die Art und die Funktion im selben Paket wie Haupt schreiben, alles funktioniert, wie ich erwarten würde? Wie in, wirft es einen Compilerfehler. Gibt es etwas, das ich an der Zwangspauschale vergessen habe?

+5

Sie brauchen nicht den, den Typ zu konvertieren, wenn es belegbar ist: https://golang.org/ref/spec#Assignability – JimB

+0

Also, was ist der spezifische Anwendungsfall für 'type Something string', wenn Sie die gleiche Typ-Sicherheit erhalten würden, indem Sie' string' selbst verwenden? – thisisnotabus

+1

"xs Typ V und T haben identische zugrunde liegende Typen und mindestens einer von V oder T ist kein benannter Typ." Ich zitiere das Dokument JimB verlinkt. Suchender zugrunde liegende Typ ist Zeichenfolge und Zeichenfolge ist ein unbenannter Typ. – mpm

Antwort

1

Wir können dieses Beispiel ein wenig weiter vereinfachen (playground):

package main 

type Foo string 

type Bar int 

func main() { 
    var f Foo = "foo" 
    var b Bar = 1 

    println(f, b) 
} 

Diese im spec's assignability section erklärt.

Ein Wert x auf eine Variable des Typs zuweisbar ist T (x "zuordenbar T") in jedem dieser Fälle:

  • x den Typ T.
  • X identisch ist Typ V und T haben identische zugrunde liegende Typen und mindestens einer von V oder T ist kein benannter Typ.
  • T ist ein Schnittstellentyp und x implementiert T
  • x ist ein bidirektionaler Kanalwert, T ist ein Kanaltyp, x Typ V und T haben identische Elementtypen und mindestens einer von V oder T ist nicht a benannter Typ.
  • x ist der vordeklarierte Bezeichner nil und T ist ein Zeiger, eine Funktion, ein Schnitt, eine Karte, ein Kanal oder ein Schnittstellentyp.
  • x eine nicht typisierte Konstante darstellbare durch einen Wert vom Typ T
Verwandte Themen