Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt die Typzusicherung bei benutzerdefinierten Typen in Go fehl, die Konvertierung ist jedoch erfolgreich?

Warum schlägt die Typzusicherung bei benutzerdefinierten Typen in Go fehl, die Konvertierung ist jedoch erfolgreich?

Linda Hamilton
Linda HamiltonOriginal
2024-11-04 07:14:02637Durchsuche

Why Does Type Assertion Fail with Custom Types in Go, But Conversion Succeeds?

Benannte Typzusicherungen und -Konvertierungen in Go

In Go ermöglichen benannte Typzusicherungen und -konvertierungen Entwicklern die Bearbeitung benutzerdefinierter und vordefinierter Datentypen. Beim Umgang mit benutzerdefinierten Typen, die vordefinierte Typen neu definieren, kann es jedoch zu Missverständnissen kommen. Lassen Sie uns dieses Problem im Detail untersuchen.

Betrachten Sie das folgende Codebeispiel:

<code class="go">type Answer string

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // Illegal usage
    acceptMe(ans)

    // Failed type assertion
    acceptMe(ans.(string))

    // Works (but why?)
    acceptMe(string(ans))
}</code>

F: Warum schlägt die Typzusicherung (ans.(string)) während der Konvertierung fehl? (string(ans)) funktioniert?

A: Typzusicherungen gelten nur für Schnittstellentypen, die einen Vertrag darstellen, den ein Wert erfüllen kann. Da benutzerdefinierte Typen wie Answer keine Schnittstellen sind, führt der Versuch, sie mithilfe der Typzusicherungssyntax zu bestätigen, zu einem Fehler.

Im Gegensatz dazu wandeln Konvertierungen explizit einen Typ in einen anderen um. Die Konvertierung (string(ans)) ist erfolgreich, da Answer einen zugrunde liegenden String-Typ hat. Go konvertiert Ans implizit in die zugrunde liegende Zeichenfolge, bevor es an AcceptMe übergeben wird.

Zusätzliche Hinweise:

  • Benutzerdefinierte Typen wie Answer sind im Wesentlichen Aliase für vorhandene Typen. Sie fügen keine neuen Funktionen oder Verhaltensweisen hinzu.
  • Typzusicherungen ermöglichen eine Typüberprüfung zur Laufzeit, während Konvertierungen eine implizite Typerzwingung durchführen.
  • Beim Umgang mit benutzerdefinierten Typen, die vordefinierte Typen umschließen, wird die Verwendung im Allgemeinen empfohlen Konvertierungen anstelle von Typzusicherungen, da sie effizienter sind und immer erfolgreich sind, wenn die zugrunde liegenden Typen übereinstimmen.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Typzusicherung bei benutzerdefinierten Typen in Go fehl, die Konvertierung ist jedoch erfolgreich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn