ホームページ  >  記事  >  バックエンド開発  >  go言語はaopをサポートしていないのでしょうか?

go言語はaopをサポートしていないのでしょうか?

青灯夜游
青灯夜游オリジナル
2022-12-27 17:04:524350ブラウズ

Go 言語は aop をサポートします。 AOP はアスペクト指向プログラミングを指します。これは、プリコンパイルと実行時の動的エージェントを通じてプログラム機能の統一されたメンテナンスを実現するテクノロジーです。AOP はオブジェクト指向のアプローチであり、主なアプリケーション シナリオは次のとおりです: ロギング、パフォーマンス統計、セキュリティ制御、トランザクション処理、例外処理など。

go言語はaopをサポートしていないのでしょうか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

aopとは何ですか?

ソフトウェア業界における AOP とは、Aspect Oriented Programming の略で、「アスペクト指向プログラミング」、プリコンパイルと動的エージェントによりプログラムの機能の一元的な維持を実現する技術を意味します。実行時。 AOP は、ソフトウェア開発のホットスポットであり、Spring フレームワークの重要なコンテンツであり、関数型プログラミングの派生パラダイムである OOP の継続です。 AOP を使用すると、ビジネス ロジックのさまざまな部分を分離できるため、ビジネス ロジックのさまざまな部分間の結合が軽減され、プログラムの再利用性が向上し、開発の効率が向上します。

アスペクト指向プログラミングは、オブジェクト指向における単なるメソッドです。コードの実行中に他のコードを動的に埋め込むことは、アスペクト指向プログラミングと呼ばれます。一般的な使用シナリオ:

  • #ログ

  • Things

  • データベース操作

  • アスペクト指向プログラミングは、クロスビジネス ロジックをアスペクトにカプセル化し、AOP の機能を使用してアスペクトをメインのビジネス ロジックに織り込むことです。いわゆるクロスビジネス ロジックとは、セキュリティ チェック、モノ、ログなど、主要なビジネス ロジックとは何の関係もない一般的なコードを指します。 AOP を使用しない場合、コードのもつれが発生します。つまり、クロスビジネス ロジックがメインのビジネス ロジックと混在することになります。このようにして、ビジネスロジックは混乱していきます。

主なアプリケーション シナリオ: ロギング、パフォーマンス統計、セキュリティ制御、トランザクション処理、例外処理など。

#コアコンセプト

JoinPoint: 接続ポイント。これは、クラス内のメソッドなど、プログラム実行における正確な実行ポイントです。
  • PointCut: エントリ ポイント。アスペクトコンポーネントを使用するコンポーネントとメソッドを指定します。
  • アドバイス: メソッドの前後など、特定の効果の場所を指定するために使用される通知。事前通知、事後通知、例外通知、復帰通知、及び周囲への通知も行います。
  • アスペクト: アスペクト。一般的なビジネス ロジック、つまり挿入するコード コンテンツをカプセル化するコンポーネント。
  • 固有の設計パターンはプロキシ パターンです。

Go 言語は AOP をサポートしていますか?

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)

}

AOP モードを使用して、主要なビジネスと副次的なビジネスを分離および分離します。実際、それだけです。

【関連する推奨事項:

Go ビデオ チュートリアル

プログラミング教育

以上がgo言語はaopをサポートしていないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。