Heim  >  Artikel  >  Backend-Entwicklung  >  Was bedeutet Golang-Typ?

Was bedeutet Golang-Typ?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼Original
2019-12-10 10:26:043694Durchsuche

Was bedeutet Golang-Typ?

Typ ist ein wichtiges und häufig verwendetes Schlüsselwort in der Go-Grammatik. Typ entspricht keineswegs nur der Typdefinition in C/C++. Es gibt zwei Möglichkeiten, den Typ zu verwenden: Der eine ist der Typalias und der andere ist die Typdefinition. Handelt es sich um die bekannte C-Sprachvariante (define und typedef)?

Typdefinition

type Student struct {
  name String
  age int
}
type I int

Typalias

type Sdt = Student
type I = int

Typ hat die folgenden Verwendungszwecke:

Struktur definieren

Schnittstelle definieren

Typdefinition

Typalias

Typabfrage

Definitionsstruktur

Struktur ist eine benutzerdefinierte abstrakte Datenstruktur. Die Struktur in Golang ähnelt der Klasse in der Java-Sprache. Sie spielt eine entscheidende Rolle. Die Verwendung von Strukturen wird im Schlüsselwort struct ausführlich vorgestellt. Werfen wir einen Blick auf das Syntaxformat zum Definieren einer Struktur:

type name struct {
    Field1  dataType
    Field2  dataType
    Field3  dataType
}

Definieren Sie eine Schnittstelle

Schnittstellenbezogene Wissenspunkte werden im Schlüsselwort interface ausführlich vorgestellt. Sehen Sie sich unten das Syntaxformat zum Definieren einer Schnittstelle an:

type name interface{
    Read()
    Write()
}

Typdefinition

Der mit der Typdefinition definierte Typ unterscheidet sich vom Originaltyp und kann daher nicht verwendet werden eine neue Typvariable, die Variablen des ursprünglichen Typs zugewiesen werden soll, sofern keine Umwandlung verwendet wird. Schauen wir uns einen Beispielcode an, um einen neuen Typ basierend auf dem Zeichenfolgentyp zu definieren. Der neue Typname lautet name:

type name string

Warum Typdefinition verwenden?

Die Typdefinition kann einen neuen Typ basierend auf dem ursprünglichen Typ erstellen. In einigen Fällen kann sie den Code prägnanter machen, wie zum Beispiel im folgenden Beispielcode:

package main
import (
  "fmt"
)
// 定义一个接收一个字符串类型参数的函数类型
type handle func(str string)
// exec函数,接收handle类型的参数
func exec(f handle) {
  f("hello")
}
func main() {
  // 定义一个函数类型变量,这个函数接收一个字符串类型的参数
  var p = func(str string) {
    fmt.Println("first", str)
  }
  exec(p)
  // 匿名函数作为参数直接传递给exec函数
  exec(func(str string) {
    fmt.Println("second", str)
  })
}

Die Ausgabeinformationen sind:

first hello
second hello

Das obige Beispiel ist eine einfache Anwendung der Typdefinition. Wenn Sie keine Typdefinition verwenden, wie sollten Sie diesen Code schreiben, wenn Sie die Funktion im obigen Beispiel realisieren möchten?

// exec函数,接收handle类型的参数
func exec(f func(str string)) {
  f("hello")
}

Der Parametertyp in der exec-Funktion muss durch func (str string) ersetzt werden. Auf den ersten Blick ist das nicht kompliziert, aber was ist, wenn exec eine Funktionsvariable empfängt, die 5 Parameter erfordert? Fühlt es sich so an, als ob die Parameterliste sehr lang sein wird?

func exec(f func(str string, str2 string, num int, money float64, flag bool)) {
  f("hello")
}

Wie aus dem obigen Code ersichtlich ist, ist die Lesbarkeit der Parameterliste der Exec-Funktion schlechter geworden. Schauen wir uns an, wie diese Funktion mithilfe von Typdefinitionen implementiert wird:

package main
import (
  "fmt"
)
// 定义一个需要五个参数的函数类型
type handle func(str string, str2 string, num int, money float64, flag bool)
// exec函数,接收handle类型的参数
func exec(f handle) {
  f("hello", "world", 10, 11.23, true)
}
func demo(str string, str2 string, num int, money float64, flag bool) {
  fmt.Println(str, str2, num, money, flag)
}
func main() {
  exec(demo)
}

Type alias

Type alias Diese Funktion wurde in golang1.9 eingeführt. Der mit einem Typalias definierte Typ ist derselbe wie der Originaltyp, das heißt, er kann Variablen des Originaltyps zugewiesen werden und verfügt über alle Methodensätze des Originaltyps. Geben Sie dem String-Typ einen Aliasnamen:

type name = string

Der Unterschied zwischen Typalias und Typdefinition besteht darin, dass zwischen dem Alias ​​und dem ursprünglichen Typ ein Zuweisungssymbol (=) hinzugefügt werden muss Typ Der durch den Alias ​​definierte Typ entspricht dem ursprünglichen Typ, während der mit dem Typ definierte Typ ein neuer Typ ist.

Das folgende Beispiel:

package main
import (
  "fmt"
)
type a = string
type b string
func SayA(str a) {
  fmt.Println(str)
}
func SayB(str b) {
  fmt.Println(str)
}
func main() {
  var str = "test"
  SayA(str)
  
  //错误参数传递,str是字符串类型,不能赋值给b类型变量
  SayB(str)
}

Dieser Code verursacht beim Kompilieren den folgenden Fehler:

.\main.go:21:6: cannot use str (type string) as type b in argument to SayB

Aus der Fehlermeldung wissen wir, dass str ein String-Typ ist und das nicht sein kann Wird als B-Typ betrachtet. Die Parameter werden an die SayB-Funktion übergeben. Allerdings kann str als Typparameter an die SayA-Funktion übergeben werden. Es ist ersichtlich, dass der mit dem Typalias definierte Typ mit dem ursprünglichen Typ übereinstimmt, während der durch die Typdefinition definierte Typ ein neuer Typ ist.

Durch das Hinzufügen einer Methode zu einem Typalias wird der Methodensatz des ursprünglichen Typs hinzugefügt.

Nach dem Hinzufügen einer Methode zu einem Typalias kann der ursprüngliche Typ diese Methode auch verwenden. Nachfolgend finden Sie einen Beispielcode:

package main
import (
  "fmt"
)
// 根据string类型,定义类型S
type S string
func (r *S) Hi() {
  fmt.Println("S hi")
}
// 定义S的类型别名为T
type T = S
func (r *T) Hello() {
  fmt.Println("T hello")
}
// 函数参数接收S类型的指针变量
func exec(obj *S) {
  obj.Hello()
  obj.Hi()
}
func main() {
  t := new(T)
  s := new(S)
  exec(s)
  // 将T类型指针变量传递给S类型指针变量
  exec(t)
}

Die Ausgabeinformationen lauten:

T hello
S hi
T hello
S hi

Im obigen Beispiel ist S der ursprüngliche Typ und T der S-Typ-Alias. Nach dem Hinzufügen der Hello-Methode zu T können auch Variablen vom Typ S die Hello-Methode verwenden. Beachten Sie, dass nach dem Hinzufügen einer Methode zu einem Typalias auch der ursprüngliche Typ diese Methode verwenden kann. Wie aus dem Beispiel hervorgeht, kann die Variable t der Variablen s vom Typ S zugewiesen werden, sodass der Typalias ein Spitzname für den ursprünglichen Typ ist, ohne dass sich im Wesentlichen etwas ändert.

Typalias kann sich nur auf benutzerdefinierte Typen im selben Paket auswirken. Beispielsweise gibt es in Golang SDK viele Pakete. Können wir Typaliase verwenden, um den Strukturtypen im SDK-Paket neue Methoden hinzuzufügen? Die Antwort lautet: Nein. Bitte beachten Sie eines: Typaliase können sich nur auf Typen innerhalb des Pakets auswirken. Wenn Typaliase für Typen außerhalb des Pakets verwendet werden, werden beim Kompilieren die folgenden Informationen abgefragt:

cannot define new methods on non-local type string

Typabfrage

Bei der Typabfrage wird der Typ der Variablen basierend auf der Variablen abgefragt. Warum besteht ein solcher Bedarf? In goalng gibt es einen speziellen Typ interface{}. Dieser Typ kann jedem Variablentyp zugewiesen werden. Wenn Sie wissen möchten, welcher Variablentyp der Variablen vom Typ interface{} zugewiesen ist, müssen Sie die Typabfrage verwenden, um dieses Problem zu lösen Anforderung. Der Beispielcode lautet wie folgt:

package main
import (
  "fmt"
)
func main() {
    // 定义一个interface{}类型变量,并使用string类型值”abc“初始化
    var a interface{} = "abc"
    
    // 在switch中使用 变量名.(type) 查询变量是由哪个类型数据赋值。
    switch v := a.(type) {
    case string:
      fmt.Println("字符串")
    case int:
        fmt.Println("整型")
    default:
      fmt.Println("其他类型", v)
    }
}

Wenn die Variable des Abfragetyps, die .(type) verwendet, nicht vom Typ interface{} ist, wird beim Kompilieren der folgende Fehler gemeldet:

cannot type switch on non-interface value a (type string)

Bei Verwendung außerhalb von switch. (Typ) wird beim Kompilieren der folgende Fehler angezeigt:

use of .(type) outside type switch

Daher kann bei Verwendung von type für die Typabfrage nur in switch verwendet werden, und der Variablentyp wird für verwendet Typabfrage muss Schnittstelle sein{}

Die chinesische PHP-Website bietet eine große Anzahl kostenloser Golang-Einführungs-Tutorials, die jeder gerne lernen kann!

Das obige ist der detaillierte Inhalt vonWas bedeutet Golang-Typ?. 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

In Verbindung stehende Artikel

Mehr sehen