Mit dem Aufkommen sozialer Medien und Content-Plattformen sind mehrstufige Kommentarsysteme zu einem wichtigen Mittel für die Benutzerinteraktion und Community-Interaktion auf verschiedenen Plattformen geworden. Es ist relativ einfach, ein mehrstufiges Kommentarsystem im Frontend zu implementieren, die Implementierung im Backend ist jedoch relativ kompliziert. In diesem Artikel wird erläutert, wie Sie mit Golang Kommentare auf mehreren Ebenen implementieren.
Implementierungsidee
Mehrstufige Kommentare sind eigentlich eine Anzeige einer Baumstruktur, und jeder Kommentar kann als Knoten verwendet werden. Mehrstufige Überprüfungssysteme können mithilfe von Baum- und Binärbäumen, den grundlegenden Datenstrukturen von Baumstrukturen, implementiert werden. In diesem Artikel entscheiden wir uns für die Implementierung eines baumstrukturierten Binärbaums.
Der Knoten des Binärbaums besteht aus zwei linken und rechten untergeordneten Knoten. Der linke Knoten ist der erste untergeordnete Knoten des aktuellen Knotens und der rechte Knoten ist der zweite untergeordnete Knoten des aktuellen Knotens. Daher müssen wir jedes Mal, wenn wir einen Kommentar hinzufügen, nur auf den übergeordneten Knoten des aktuellen Kommentars und seine linken und rechten untergeordneten Knoten achten.
Datenbankdesign
Um ein mehrstufiges Kommentarsystem zu implementieren, muss die Eltern-Kind-Beziehung jedes Kommentars in der Datenbank gespeichert werden. Im Allgemeinen können wir zwei Möglichkeiten zum Speichern von Baumstrukturen verwenden:
- Mehrtabellenassoziation verwenden
- Selbstreferenzielle Beziehungen in einer einzelnen Tabelle verwenden#🎜 🎜 #
CREATE TABLE `comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL COMMENT '父级评论id', `content` varchar(255) DEFAULT NULL COMMENT '评论内容', `created_at` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), KEY `parent_id` (`parent_id`), CONSTRAINT `comment_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `comment` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='评论表'In der obigen Tabellenstruktur ist
die Erstellungszeit. parent_id
表示当前评论的父节点id,如果当前评论是一级评论,则parent_id
为null。id
为当前评论的id,content
为评论内容,created_at
dsn := "root:123456@tcp(127.0.0.1:3306)/test" db, err := sql.Open("mysql", dsn) if err != nil { fmt.Printf("mysql connect error %s", err.Error()) return }Kommentar einfügenBeim Einfügen eines Kommentars müssen Sie festlegen, ob der aktuelle Kommentar als übergeordneter Knoten oder als untergeordneter Knoten verarbeitet wird. Wenn der aktuelle Kommentar als übergeordneter Knoten verwendet wird, wird er direkt in die Datenbank eingefügt. Wenn der aktuelle Kommentar ein untergeordneter Knoten ist, muss der rechte Knoten des übergeordneten Knotens aktualisiert werden.
// 添加评论 func AddComment(comment Comment) error { if comment.ParentID == 0 { _, err := db.Exec("INSERT INTO comment(parent_id, content, created_at) VALUES(?, ?, ?)", nil, comment.Content, comment.CreatedAt) if err != nil { return err } } else { var rightNode *int err := db.QueryRow("SELECT right_node FROM comment WHERE id = ?", comment.ParentID).Scan(&rightNode) if err != nil { return err } tx, err := db.Begin() if err != nil { return err } // 更新右节点 _, err = tx.Exec("UPDATE comment SET right_node = right_node + 2 WHERE right_node > ?", rightNode) if err != nil { tx.Rollback() return err } _, err = tx.Exec("UPDATE comment SET left_node = left_node + 2 WHERE left_node > ?", rightNode) if err != nil { tx.Rollback() return err } _, err = tx.Exec("INSERT INTO comment(parent_id, left_node, right_node, content, created_at) VALUES(?, ?, ?, ?, ?)", comment.ParentID, rightNode, rightNode+1, comment.Content, comment.CreatedAt) if err != nil { tx.Rollback() return err } tx.Commit() } return nil }Kommentare abfragenBei der Abfrage von Kommentaren müssen Sie diese nach der linken und rechten Reihenfolge der Knoten sortieren, um eine baumstrukturierte Kommentarliste zu erhalten. Da beim Abfragen von Kommentaren der linke und der rechte Knoten zum Sortieren verwendet werden müssen, müssen die linken und rechten Knotenspalten zu den Abfragebedingungen hinzugefügt werden. Darüber hinaus müssen Sie auch ein Ebenenfeld verwenden, um anzugeben, auf welcher Knotenebene sich der aktuelle Knoten befindet, um die Front-End-Anzeige zu erleichtern.
type Comment struct { ID int `json:"id"` ParentID int `json:"parent_id"` Content string `json:"content"` LeftNode int `json:"left_node"` RightNode int `json:"right_node"` Level int `json:"level"` CreatedAt string `json:"created_at"` } // 获取评论列表 func GetComments() ([]Comment, error) { rows, err := db.Query("SELECT id, parent_id, content, created_at, left_node, right_node, (COUNT (parent.id) -1) AS level FROM comment AS node, comment AS parent WHERE node.left_node BETWEEN parent.left_node AND parent.right_node GROUP BY node.id ORDER BY left_node") if err != nil { return nil, err } defer rows.Close() var comments []Comment for rows.Next() { var comment Comment err := rows.Scan(&comment.ID, &comment.ParentID, &comment.Content, &comment.CreatedAt, &comment.LeftNode, &comment.RightNode, &comment.Level) if err != nil { return nil, err } comments = append(comments, comment) } return comments, nil }Kommentar löschenBeim Löschen eines Kommentars müssen Sie feststellen, ob es sich bei dem aktuellen Kommentar um einen übergeordneten Knoten oder einen untergeordneten Knoten handelt um den gesamten Teilbaum zu löschen.
// 删除评论 func DeleteComment(id int) error { tx, err := db.Begin() if err != nil { return err } var leftNode int var rightNode int err = tx.QueryRow("SELECT left_node, right_node FROM comment WHERE id = ?", id).Scan(&leftNode, &rightNode) if err != nil { tx.Rollback() return err } if leftNode == 1 && rightNode > 1 { // 删除子树 _, err = tx.Exec("DELETE FROM comment WHERE left_node >= ? AND right_node <= ?;", leftNode, rightNode) if err != nil { tx.Rollback() return err } err = tx.Commit() if err != nil { tx.Rollback() return err } } else { // 删除单个节点 _, err = tx.Exec("DELETE FROM comment WHERE id = ?", id) if err != nil { tx.Rollback() return err } err = tx.Commit() if err != nil { tx.Rollback() return err } } return nil }FazitDurch die obige Code-Implementierung können wir schnell ein voll funktionsfähiges mehrstufiges Kommentarsystem aufbauen. Dies ist natürlich nur eine grundlegende Implementierungsmethode. In tatsächlichen Szenarien müssen entsprechende Optimierungen und Erweiterungen entsprechend den spezifischen Anforderungen vorgenommen werden.
Das obige ist der detaillierte Inhalt vonGolang implementiert mehrstufige Kommentare. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Die Hauptunterschiede zwischen Golang und Python sind Parallelitätsmodelle, Typsysteme, Leistung und Ausführungsgeschwindigkeit. 1. Golang verwendet das CSP -Modell, das für hohe gleichzeitige Aufgaben geeignet ist. Python verlässt sich auf Multi-Threading und Gil, was für I/O-intensive Aufgaben geeignet ist. 2. Golang ist ein statischer Typ und Python ist ein dynamischer Typ. 3.. Golang kompilierte Sprachausführungsgeschwindigkeit ist schnell und Python interpretierte die Sprachentwicklung schnell.

Golang ist in der Regel langsamer als C, aber Golang hat mehr Vorteile für die gleichzeitige Programmier- und Entwicklungseffizienz: 1) Golangs Müllsammlung und Parallelitätsmodell macht es in hohen Parallelitätsszenarien gut ab. 2) C erhält eine höhere Leistung durch das manuelle Speichermanagement und die Hardwareoptimierung, weist jedoch eine höhere Komplexität der Entwicklung auf.

Golang wird häufig in Cloud -Computing und DevOps verwendet, und seine Vorteile liegen in Einfachheit, Effizienz und gleichzeitigen Programmierfunktionen. 1) Beim Cloud Computing behandelt Golang effizient gleichzeitige Anforderungen über Goroutine- und Kanalmechanismen. 2) In DevOps machen Golangs schnelle Zusammenstellung und plattformübergreifende Funktionen die erste Wahl für Automatisierungswerkzeuge.

Golang und C haben jeweils ihre eigenen Vorteile bei der Leistungseffizienz. 1) Golang verbessert die Effizienz durch Goroutine- und Müllsammlung, kann jedoch eine Pause einführen. 2) C realisiert eine hohe Leistung durch das manuelle Speicherverwaltung und -optimierung, aber Entwickler müssen sich mit Speicherlecks und anderen Problemen befassen. Bei der Auswahl müssen Sie Projektanforderungen und Teamtechnologie -Stack in Betracht ziehen.

Golang eignet sich besser für hohe Parallelitätsaufgaben, während Python mehr Vorteile bei der Flexibilität hat. 1. Golang behandelt die Parallelität effizient über Goroutine und Kanal. 2. Python stützt sich auf Threading und Asyncio, das von GIL betroffen ist, jedoch mehrere Parallelitätsmethoden liefert. Die Wahl sollte auf bestimmten Bedürfnissen beruhen.

Die Leistungsunterschiede zwischen Golang und C spiegeln sich hauptsächlich in der Speicherverwaltung, der Kompilierungsoptimierung und der Laufzeiteffizienz wider. 1) Golangs Müllsammlung Mechanismus ist praktisch, kann jedoch die Leistung beeinflussen.

Wählen SieGolangforHighperformanceConcurcurrency, idealforbackendServicesandNetworkProgramming; selectPythonforrapidDevelopment, DataScience und MachinelearningDuEToSverseStilityAntenSiveselibrary.

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.


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

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

DVWA
Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)