GoFrame 數(shù)據(jù)返回-Exit控制

2022-04-14 09:38 更新

Exit, ExitAll與ExitHook

  • ?Exit?: 僅退出當(dāng)前執(zhí)行的邏輯方法,不退出后續(xù)的請(qǐng)求流程,可用于替代?return?。
  • ?ExitAll?: 強(qiáng)行中斷當(dāng)前執(zhí)行流程,當(dāng)前執(zhí)行方法的后續(xù)邏輯以及后續(xù)所有的邏輯方法將不再執(zhí)行,常用于權(quán)限控制。
  • ?ExitHook?: 當(dāng)路由匹配到多個(gè)?HOOK?方法時(shí),默認(rèn)是按照路由匹配優(yōu)先級(jí)順序執(zhí)行?HOOK?方法。當(dāng)在?HOOK?方法中調(diào)用?ExitHook?方法后,后續(xù)的?HOOK?方法將不會(huì)被繼續(xù)執(zhí)行,作用類似?HOOK?方法覆蓋。

這三個(gè)退出函數(shù)僅在服務(wù)函數(shù)和?HOOK?事件回調(diào)函數(shù)中有效,無(wú)法控制中間件的執(zhí)行流程。

由于?ExitAll?和?ExitHook?方法在應(yīng)用層比較少用,因此這里僅介紹?Exit?方法的使用。

?Exit*?流程退出特性底層采用的是?panic...recover...?機(jī)制來(lái)實(shí)現(xiàn)的,?CPU?執(zhí)行損耗大約幾十納秒(?ns?),通過(guò)極少的運(yùn)行時(shí)開銷來(lái)提高易用性。

Exit返回方法

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
	s := g.Server()
	s.BindHandler("/", func(r *ghttp.Request) {
		if r.GetInt("type") == 1 {
			r.Response.Writeln("john")
		}
		r.Response.Writeln("smith")
	})
	s.SetPort(8199)
	s.Run()
}

執(zhí)行后,我們?cè)L問(wèn) http://127.0.0.1:8199/?type=1 ,可以看到頁(yè)面輸出了:

john
smith

我們將以上代碼稍微調(diào)整一下:

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
	s := g.Server()
	s.BindHandler("/", func(r *ghttp.Request) {
		if r.GetInt("type") == 1 {
            r.Response.Writeln("john")
            r.Exit()
		}
		r.Response.Writeln("smith")
	})
	s.SetPort(8199)
	s.Run()
}

執(zhí)行后,我們?cè)俅卧L問(wèn) http://127.0.0.1:8199/?type=1 ,可以看到頁(yè)面輸出了:

john

此外,?Response?對(duì)象中提供了很多?Write*Exit?的方法,表示輸出內(nèi)容后立即調(diào)用?Exit?方法退出當(dāng)前服務(wù)方法。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)