Heim > Artikel > Backend-Entwicklung > Go-Typ-Einschränkungen, die das Verhalten veränderlicher Strukturen beschreiben
php-Editor Xinyi stellt Ihnen heute eine Go-Typ-Einschränkung vor, die das Verhalten von Variablenstrukturen beschreibt. In der Go-Sprache können wir Schnittstellentypen verwenden, um eine Reihe von Methoden zu definieren und die Typen eingehender Parameter durch Typeinschränkungen einzuschränken. Diese Methode kann zur Kompilierungszeit eine Typprüfung durchführen, um die Sicherheit und Zuverlässigkeit des Codes zu gewährleisten. Durch die rationale Verwendung von Schnittstellentypen und Typbeschränkungen können wir Codeflexibilität und Skalierbarkeit erreichen und die Wartbarkeit und Lesbarkeit von Programmen verbessern. Schauen wir uns als Nächstes genauer an, wie man Go-Typ-Einschränkungen verwendet, um das Verhalten veränderlicher Strukturen zu beschreiben.
Ich möchte eine generische Funktion definieren, bei der Typbeschränkungen das Verhalten veränderlicher Strukturen beschreiben.
Was ich mit „veränderlichem Verhalten“ meine, ist eine Schnittstelle wie diese:
type Unmarshaler interface { Unmarshal(data []byte) error }
...Die Umsetzung sieht so aus:
type Foo struct { Content string } func (f *Foo) Unmarshal(data []byte) error { f.Content = string(data) return nil }
Aufrufen der Schnittstellenmethode ändert die Struktur .
Was ich tun möchte, ist eine generische Funktion zu definieren, bei der die Typbeschränkung die obige Schnittstelle ist. Generische Funktionen sind dafür verantwortlich, eine Instanz eines konkreten Typs zu initialisieren, sie dann mithilfe von Schnittstellenmethoden zu mutieren und zurückzugeben.
func Unmarshal[T Unmarshaler](data []byte) (T, error) { var m T return m, m.Unmarshal(data) }
Ich möchte diese generische Funktion also mit dem Typ Foo aufrufen können.
func main() { foo, err := Unmarshal[*Foo]([]byte("hello")) if err == nil { log.Println(foo.Content) // hello } else { log.Fatal(err) } }
Ich muss *Foo
作为类型参数,因为只有指向 Foo
的指针才实现 Unmarshaler
接口。但是,当 Foo 的 Unmarshal
方法收到 f
的 nil
值时,就会出现恐慌。这对我来说都是有意义的,因为 var m T
将使指向 Foo
einen Zeigerwert von Null, also Null, übergeben. Aber ich bin mir nicht sicher, ob ich in eine Sackgasse geraten bin?
https://go.dev/play/p/H5s59NWNiDA
Soweit ich es beschreiben kann, stoße ich immer dann auf dieses Problem, wenn meine Typeinschränkungen ein veränderbares Strukturverhalten beschreiben und meine generische Funktion die Instanz der Struktur initialisieren und dann mutieren möchte. Ist es möglich? Gibt es eine bessere Möglichkeit, dies zu bauen?
Das Kernproblem besteht darin, den Wert für bestimmte Typen im Paket zu erstellen, aber es wäre einfacher, den Aufrufer den Wert als Parameter übergeben zu lassen. T
创建有用的值。有几种方法可以做到这一点: m := make(T)
(地图和频道)等。您可以使用 reflect
func Unmarshal[T Unmarshaler](m T, data []byte) (T, error) { return m, m.Unmarshal(data) }Rufen Sie die Funktion wie folgt auf:
foo, err := Unmarshal(&Foo{}, []byte("hello"))
https://www.php.cn/link/8eb51d0a68e9373df41f88e5b551d4a3
Das obige ist der detaillierte Inhalt vonGo-Typ-Einschränkungen, die das Verhalten veränderlicher Strukturen beschreiben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!