真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言支不支持aop

這篇“go語言支不支持aop”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“go語言支不支持aop”文章吧。

十余年的嵐山網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整嵐山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“嵐山網(wǎng)站設(shè)計(jì)”,“嵐山網(wǎng)站推廣”以來,每個客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

go語言支持aop。AOP是指面向切面編程,是通過預(yù)編譯方式和運(yùn)行期間動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù);AOP是面向?qū)ο笾械囊环N方式,主要應(yīng)用場景:日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。

什么是aop?

在軟件業(yè),AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期間動態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點(diǎn),也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對業(yè)務(wù)邏輯的各個部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。

面向切面編程是面向?qū)ο笾械囊环N方式而已。在代碼執(zhí)行過程中,動態(tài)嵌入其他代碼,叫做面向切面編程。常見的使用場景:

  • 日志

  • 事物

  • 數(shù)據(jù)庫操作

面向切面編程,就是將交叉業(yè)務(wù)邏輯封裝成切面,利用AOP的功能將切面織入到主業(yè)務(wù)邏輯中。所謂交叉業(yè)務(wù)邏輯是指,通用的,與主業(yè)務(wù)邏輯無關(guān)的代碼,如安全檢查,事物,日志等。若不使用AOP,則會出現(xiàn)代碼糾纏,即交叉業(yè)務(wù)邏輯與主業(yè)務(wù)邏輯混合在一起。這樣,會使業(yè)務(wù)邏輯變得混雜不清。

主要應(yīng)用場景:日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。

核心概念

  • JoinPoint:連接點(diǎn)。是程序執(zhí)行中的一個精確執(zhí)行點(diǎn),例如類中的一個方法。

  • PointCut:切入點(diǎn)。指定哪些組件的哪些方法使用切面組件。

  • Advice:通知,用于指定具體作用的位置,是方法之前或之后等等,分為前置通知,后置通知,異常通知,返回通知,環(huán)繞通知。

  • Aspect: 切面。封裝通用業(yè)務(wù)邏輯的組件,即我們想要插入的代碼內(nèi)容。

其內(nèi)在設(shè)計(jì)模式為代理模式。

go語言支不支持aop?

go語言支持aop。

Go實(shí)現(xiàn)AOP的示例:

// User 
type User struct {
	Name string
	Pass string
}

// Auth 驗(yàn)證
func (u *User) Auth() {
	// 實(shí)際業(yè)務(wù)邏輯
	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 用戶名驗(yàn)證
type ValidateNameAdvice struct {
}

// ValidatePasswordAdvice 密碼驗(yàn)證
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 前置校驗(yàn)
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 校驗(yàn),切入點(diǎn)
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)
	}

    // 實(shí)際邏輯
	p.user.Auth()

    // 后置通知
	group.After(p.user)

}

使用AOP模式進(jìn)行解耦,分離主業(yè)務(wù)與副業(yè)務(wù)。其實(shí)也就那樣。

以上就是關(guān)于“go語言支不支持aop”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前標(biāo)題:go語言支不支持aop
地址分享:http://weahome.cn/article/jgioio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部