


Wie implementiert man allgemeine Funktionen gekapselter Modelle in Golang?
In Golang können gemeinsame Funktionen gekapselter Modelle durch den Einsatz von Strukturen und Methoden implementiert werden. Eine Struktur ist ein benutzerdefinierter Datentyp, der zum Kapseln verwandter Daten und Methoden verwendet werden kann. Methoden sind Funktionen, die einer Struktur zugeordnet sind, und auf die Mitglieder der Struktur kann innerhalb der Methode zugegriffen und diese manipuliert werden. Indem wir Funktionen als Strukturen definieren, können wir Funktionen bestimmten Strukturen zuordnen, um allgemeine Operationen in gekapselten Modellen zu implementieren. In Golang können wir Empfänger verwenden, um die Struktur anzugeben, zu der die Methode gehört. Der Empfänger kann ein Werttyp oder ein Zeigertyp sein. Wählen Sie den geeigneten Empfängertyp entsprechend Ihren Anforderungen aus. Durch die Definition der Strukturmethode können wir allgemeine Vorgänge im gekapselten Modell implementieren, z. B. das Abrufen oder Festlegen von Feldwerten, das Durchführen bestimmter Vorgänge usw. Auf diese Weise können wir auf die gekapselten Daten zugreifen und diese bearbeiten, indem wir die Methoden der Struktur aufrufen, wodurch flexiblerer und wiederverwendbarer Code entsteht.
Frageninhalt
Ich habe 2 Pakete als Models:
Kategorie:
package class import ( "encoding/json" "student_management/model/base" ) type classes struct { classes []class } type class struct { id int `json:"student_id"` name int `json:"name"` homeroomteacherid int `json:"homeroom_teacher_id"` } func readdata() (chan class, int) { var classes classes bytevalue := base.readjson("db/student_class.json") json.unmarshal(bytevalue, &classes) classchannel := make(chan class) go func () { for i := 0; i < len(classes.classes); i++ { classchannel <- classes.classes[i] } close(classchannel) }() return classchannel, len(classes.classes) }
Lehrer:
package teacher import ( "encoding/json" base "student_management/model/base" ) type teachers struct { teachers []teacher `json:"teachers"` } type teacher struct { base.persions homeroomteacher bool `json:"homeroom_teacher"` } func readdata() (chan teacher, int) { var teachers teachers bytevalue := base.readjson("db/teachers.json") json.unmarshal(bytevalue, &teachers) teacherchannel := make(chan teacher) go func () { for i := 0; i < len(teachers.teachers); i++ { teacherchannel <- teachers.teachers[i] } close(teacherchannel) }() return teacherchannel, len(teachers.teachers) }
So können Sie sehen, dass die Funktion readdata wiederholt ausgeführt wird. Jetzt kann ich class.readdata()
和 teacher.readdata()
verwenden, um Daten vom Kanal abzurufen.
Wie schreibe ich eine readdata()-Funktion zur Verwendung durch zwei Pakete?
Ich habe versucht, ein Basispaket mit Generika wie diesem zu erstellen:
package base func ReadData[Models any, Model any](fileName string, m Models) (chan interface{}, int) { byteValue := ReadJSON(fileName) json.Unmarshal(byteValue, &m) channel := make(chan Model) go func () { for i := 0; i < len(m.Models); i++ { channel <- m.Models[i] } close(channel) }() return channel, len(models.Models) }
Aber es kann nicht gefunden werdenm.models
,我的意思是teachers.teachers
或classes.classes
Kann nicht verwendet werden
Bitte sagen Sie mir, was in diesem Fall zu tun ist
Umgehung
Verwenden Sie Generika (eingeführt in Go 1.18). Erstellen Sie eine readdata()
-Funktion mit Parametertypen, die die Werte darstellen, die aus JSON dekodiert und an den Kanal übergeben werden sollen.
Hinweis: Sie sollten nach Fehlern suchen und diese melden (einschließlich derer von base.readjson()
).
func readdata[t any](filename, fieldname string) (chan t, int, error) { var m map[string][]t bytevalue := base.readjson(filename) if err := json.unmarshal(bytevalue, &wrapper); err != nil { return nil, 0, err } values := m[fieldname] valueschannel := make(chan t) go func() { for _, v := range values { valueschannel <- v } close(valueschannel) }() return valueschannel, len(values), nil }
Anrufbeispiel:
ch, n, err := readdata[class.class]("db/student_class.json", "classes") // or ch, n, err := readdata[teacher.teacher]("db/teachers.json", "teachers")
Bitte beachten Sie, dass die Rückgabe der Anzahl der gelesenen Werte redundant sein sollte. Da Sie den zurückgegebenen Kanal korrekt geschlossen haben, kann der Anrufer for range
auf dem zurückgegebenen Kanal verwenden, wodurch alle darauf gesendeten Werte korrekt empfangen und dann beendet werden.
Beachten Sie außerdem, dass diese Parallelität redundant ist und nur die Effizienz verringert, da alle Werte bereit (dekodiert) sind, wenn sie zum Kanal zurückkehren. Sie haben ein Stück dekodierter Werte. Geben Sie es einfach zurück und lassen Sie den Aufrufer entscheiden, wie es damit umgehen möchte (gleichzeitig oder nicht gleichzeitig).
Ihr readdata()
sollte also so aussehen:
func readdata[t any](filename, fieldname string) ([]t, error) { var m map[string][]t bytevalue := base.readjson(filename) if err := json.unmarshal(bytevalue, &wrapper); err != nil { return nil, err } return m[fieldname] }
Beachten Sie außerdem, dass, wenn das Eingabe-JSON-Objekt nur ein Feld hat, kein fieldname
,您可以从解码后的 m
übergeben werden muss, um den Wert in der Karte zu erhalten, wie folgt:
func readdata[t any](filename string) ([]t, error) { var m map[string][]t bytevalue := base.readjson(filename) if err := json.unmarshal(bytevalue, &wrapper); err != nil { return nil, err } for _, v := range m { return v, nil } return nil, errors.new("empty json") }
Dann ist der Aufruf ganz einfach:
classes, err := ReadData[class.Class]("db/student_class.json") // or teachers, err := ReadData[teacher.Teacher]("db/teachers.json")
Das obige ist der detaillierte Inhalt vonWie implementiert man allgemeine Funktionen gekapselter Modelle in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

In dem Artikel wird der Befehl go fMT in Go -Programmierung erörtert, in dem Code formatiert werden, um offizielle Richtlinien für den Stil einzuhalten. Es zeigt die Bedeutung von GO FMT für die Aufrechterhaltung der Debatten mit Codekonsistenz, Lesbarkeit und Reduzierung von Stildebatten. Best Practices fo

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

In diesem Artikel werden eine Vielzahl von Methoden und Tools eingeführt, um PostgreSQL -Datenbanken im Debian -System zu überwachen, um die Datenbankleistung vollständig zu erfassen. 1. verwenden Sie PostgreSQL, um die Überwachungsansicht zu erstellen. PostgreSQL selbst bietet mehrere Ansichten für die Überwachung von Datenbankaktivitäten: PG_STAT_ACTIVITY: Zeigt Datenbankaktivitäten in Echtzeit an, einschließlich Verbindungen, Abfragen, Transaktionen und anderen Informationen. PG_STAT_REPLIKATION: Monitore Replikationsstatus, insbesondere für Stream -Replikationscluster. PG_STAT_DATABASE: Bietet Datenbankstatistiken wie Datenbankgröße, Transaktionsausschüsse/Rollback -Zeiten und andere Schlüsselindikatoren. 2. Verwenden Sie das Log -Analyse -Tool PGBADG
