久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      go語言不支持aop嗎

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

      go語言不支持aop嗎

      本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

      什么是aop?

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

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

      • 日志

      • 事物

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

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

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

      核心概念

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

      • 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:%sn", 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 sucessn", 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 sucessn", 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)  }
      登錄后復(fù)制

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)