go-Sprache unterstützt aop. AOP bezieht sich auf aspektorientierte Programmierung, eine Technologie, die eine einheitliche Wartung von Programmfunktionen durch Vorkompilierung und dynamische Proxys während der Laufzeit erreicht. AOP ist ein objektorientierter Ansatz mit Hauptanwendungsszenarien: Protokollierung, Leistungsstatistik, Sicherheitskontrolle. Transaktionsverarbeitung, Ausnahmebehandlung usw.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Was ist AOP?
In der Softwareindustrie ist AOP die Abkürzung für Aspect Oriented Programming, was bedeutet: Aspektorientierte Programmierung, eine Technologie, die eine einheitliche Wartung von Programmfunktionen durch Vorkompilierung und dynamische Proxys zur Laufzeit erreicht. AOP ist die Fortsetzung von OOP, einem Hotspot in der Softwareentwicklung, einem wichtigen Inhalt im Spring-Framework und einem abgeleiteten Paradigma der funktionalen Programmierung. AOP kann verwendet werden, um verschiedene Teile der Geschäftslogik zu isolieren, wodurch die Kopplung zwischen den verschiedenen Teilen der Geschäftslogik verringert, die Wiederverwendbarkeit des Programms verbessert und die Effizienz der Entwicklung verbessert wird.
Aspektorientierte Programmierung ist nur eine Methode der objektorientierten Programmierung. Das dynamische Einbetten von anderem Code während der Codeausführung wird als aspektorientierte Programmierung bezeichnet. Häufige Verwendungsszenarien:
Protokolle
Dinge
Datenbankoperationen
Aspektorientierte Programmierung besteht darin, geschäftsübergreifende Logik in Aspekte zu kapseln und die Funktionen von AOP zu verwenden, um Aspekte in das Hauptgeschäft einzubinden logische Mitte. Die sogenannte Cross-Business-Logik bezieht sich auf allgemeinen Code, der nichts mit der Hauptgeschäftslogik zu tun hat, wie z. B. Sicherheitsüberprüfungen, Dinge, Protokolle usw. Wenn AOP nicht verwendet wird, kommt es zu einer Codeverschränkung, das heißt, die geschäftsübergreifende Logik wird mit der Hauptgeschäftslogik vermischt. Auf diese Weise wird die Geschäftslogik unübersichtlich.
Hauptanwendungsszenarien: Protokollierung, Leistungsstatistik, Sicherheitskontrolle, Transaktionsverarbeitung, Ausnahmebehandlung usw.
Kernkonzept
JoinPoint: Verbindungspunkt. Es handelt sich um einen genauen Ausführungspunkt bei der Programmausführung, beispielsweise um eine Methode in einer Klasse.
PointCut: Schnittpunkt. Geben Sie an, welche Komponenten und welche Methoden Aspektkomponenten verwenden.
Hinweis: Benachrichtigungen werden verwendet, um den Ort bestimmter Auswirkungen anzugeben, ob vor oder nach einer Methode usw., und werden in Vorbenachrichtigung, Nachbenachrichtigung, Ausnahmebenachrichtigung, Rückgabebenachrichtigung und Umgebungsbenachrichtigung unterteilt.
Aspekt: Aspekt. Komponenten, die allgemeine Geschäftslogik kapseln, also den Codeinhalt, den wir einfügen möchten.
Das interne Entwurfsmuster ist das Proxy-Muster.
Unterstützt die Go-Sprache AOP?
go language unterstützt aop.
Beispiel für die Go-Implementierung von AOP:
// User type User struct { Name string Pass string } // Auth 验证 func (u *User) Auth() { // 实际业务逻辑 fmt.Printf("register user:%s, use pass:%s\n", u.Name, u.Pass) } // UserAdvice type UserAdvice interface { // Before 前置通知 Before(user *User) error // After 后置通知 After(user *User) } // ValidatePasswordAdvice 用户名验证 type ValidateNameAdvice struct { } // ValidatePasswordAdvice 密码验证 type ValidatePasswordAdvice struct { MinLength int MaxLength int } func (ValidateNameAdvice) Before(user *User) error { fmt.Println("ValidateNameAdvice before") if user.Name == "admin" { return errors.New("admin can't be used") } return nil } func (ValidateNameAdvice) After(user *User) { fmt.Println("ValidateNameAdvice after") fmt.Printf("username:%s validate sucess\n", user.Name) } // Before 前置校验 func (advice ValidatePasswordAdvice) Before(user *User) error { fmt.Println("ValidatePasswordAdvice before") if user.Pass == "123456" { return errors.New("pass isn't strong") } if len(user.Pass) > advice.MaxLength { return fmt.Errorf("len of pass must less than:%d", advice.MaxLength) } if len(user.Pass) < advice.MinLength { return fmt.Errorf("len of pass must greater than:%d", advice.MinLength) } return nil } func (ValidatePasswordAdvice) After(user *User) { fmt.Println("ValidatePasswordAdvice after") fmt.Printf("password:%s validate sucess\n", user.Pass) } // UserAdviceGroup,通知管理组 type UserAdviceGroup struct { items []UserAdvice } // Add 注入可选通知 func (g *UserAdviceGroup) Add(advice UserAdvice) { g.items = append(g.items, advice) } func (g *UserAdviceGroup) Before(user *User) error { for _, item := range g.items { if err := item.Before(user); err != nil { return err } } return nil } // After func (g *UserAdviceGroup) After(user *User) { for _, item := range g.items { item.After(user) } } // UserProxy 代理,也是切面 type UserProxy struct { user *User } // NewUser return UserProxy func NewUser(name, pass string) UserProxy { return UserProxy{user:&User{Name:name, Pass:pass}} } // Auth 校验,切入点 func (p UserProxy) Auth() { group := UserAdviceGroup{} group.Add(&ValidatePasswordAdvice{MaxLength:10, MinLength:6}) group.Add(&ValidateNameAdvice{}) // 前置通知 if err := group.Before(p.user); err != nil { panic(err) } // 实际逻辑 p.user.Auth() // 后置通知 group.After(p.user) }
Verwenden Sie den AOP-Modus zur Entkopplung und Trennung von Hauptgeschäft und Nebengeschäft. Tatsächlich ist es das.
【Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht】
Das obige ist der detaillierte Inhalt vonUnterstützt die Go-Sprache AOP nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!