Go 言語は aop をサポートします。 AOP はアスペクト指向プログラミングを指します。これは、プリコンパイルと実行時の動的エージェントを通じてプログラム機能の統一されたメンテナンスを実現するテクノロジーです。AOP はオブジェクト指向のアプローチであり、主なアプリケーション シナリオは次のとおりです: ロギング、パフォーマンス統計、セキュリティ制御、トランザクション処理、例外処理など。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
aopとは何ですか?
ソフトウェア業界における AOP とは、Aspect Oriented Programming の略で、「アスペクト指向プログラミング」、プリコンパイルと動的エージェントによりプログラムの機能の一元的な維持を実現する技術を意味します。実行時。 AOP は、ソフトウェア開発のホットスポットであり、Spring フレームワークの重要なコンテンツであり、関数型プログラミングの派生パラダイムである OOP の継続です。 AOP を使用すると、ビジネス ロジックのさまざまな部分を分離できるため、ビジネス ロジックのさまざまな部分間の結合が軽減され、プログラムの再利用性が向上し、開発の効率が向上します。
アスペクト指向プログラミングは、オブジェクト指向における単なるメソッドです。コードの実行中に他のコードを動的に埋め込むことは、アスペクト指向プログラミングと呼ばれます。一般的な使用シナリオ:
主なアプリケーション シナリオ: ロギング、パフォーマンス統計、セキュリティ制御、トランザクション処理、例外処理など。
#コアコンセプトJoinPoint: 接続ポイント。これは、クラス内のメソッドなど、プログラム実行における正確な実行ポイントです。
go 言語は aop をサポートしています。
AOP の Go 実装の例:// 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) }
Go ビデオ チュートリアル
、プログラミング教育 】
以上がgo言語はaopをサポートしていないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。