欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go設(shè)計(jì)模式之代理模式講解和代碼示例

 更新時(shí)間:2023年07月24日 08:22:16   作者:demo007x  
這篇文章主要介紹了Go代理模式,代理是一種結(jié)構(gòu)型設(shè)計(jì)模式, 讓你能提供真實(shí)服務(wù)對(duì)象的替代品給客戶端使用,本文將對(duì)Go代理模式進(jìn)行講解以及代碼示例,需要的朋友可以參考下

Go 代理模式講解和代碼示例

代理是一種結(jié)構(gòu)型設(shè)計(jì)模式, 讓你能提供真實(shí)服務(wù)對(duì)象的替代品給客戶端使用。 代理接收客戶端的請(qǐng)求并進(jìn)行一些處理 (訪問控制和緩存等), 然后再將請(qǐng)求傳遞給服務(wù)對(duì)象。

代理對(duì)象擁有和服務(wù)對(duì)象相同的接口, 這使得當(dāng)其被傳遞給客戶端時(shí)可與真實(shí)對(duì)象互換。

概念示例

Nginx 這樣的 Web 服務(wù)器可充當(dāng)應(yīng)用程序服務(wù)器的代理:

  • 提供了對(duì)應(yīng)用程序服務(wù)器的受控訪問權(quán)限。
  • 可限制速度。
  • 可緩存請(qǐng)求。

server.go: 主體

package main
type server interface {
	handleRequest(string, string) (int, string)
}

nginx.go: 代理

package main
type Nginx struct {
	application       *Application
	maxAllowedRequest int
	rateLimiter       map[string]int
}
func newNginxServer() *Nginx {
	return &Nginx{
		application:       &Application{},
		maxAllowedRequest: 2,
		rateLimiter:       make(map[string]int),
	}
}
func (n *Nginx) handleRequest(url, method string) (int, string) {
	allowed := n.checkRateLimiting(url)
	if !allowed {
		return 403, "Not Allowed"
	}
	return n.application.handleRequest(url, method)
}
func (n *Nginx) checkRateLimiting(url string) bool {
	if n.rateLimiter[url] == 0 {
		n.rateLimiter[url] = 1
	}
	if n.rateLimiter[url] > n.maxAllowedRequest {
		return false
	}
	n.rateLimiter[url] = n.rateLimiter[url] + 1
	return true
}

application.go: 真實(shí)主體

package main
type Application struct{}
func (a *Application) handleRequest(url, method string) (int, string) {
	if url == "/app/status" && method == "GET" {
		return 200, "ok"
	}
	if url == "/create/user" && method == "POST" {
		return 201, "user created"
	}
	return 404, "Not OK"
}

main.go: 客戶端代碼

package main
import "fmt"
func main() {
	nginxServer := newNginxServer()
	appStatusURL := "/app/status"
	createuserURL := "/create/user"
	httpCode, msg := nginxServer.handleRequest(appStatusURL, "GET")
	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg)
	httpCode, msg = nginxServer.handleRequest(appStatusURL, "GET")
	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg)
	httpCode, msg = nginxServer.handleRequest(appStatusURL, "GET")
	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg)
	httpCode, msg = nginxServer.handleRequest(createuserURL, "POST")
	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg)
	httpCode, msg = nginxServer.handleRequest(createuserURL, "GET")
	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, msg)
}

output.txt: 執(zhí)行結(jié)果

Url: /app/status
HttpCode: 200
Body: ok

Url: /app/status
HttpCode: 200
Body: ok

Url: /app/status
HttpCode: 403
Body: Not Allowed

Url: /app/status
HttpCode: 201
Body: user created

Url: /app/status
HttpCode: 404
Body: Not OK

到此這篇關(guān)于Go設(shè)計(jì)模式之代理模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go代理模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO比較兩個(gè)對(duì)象是否相同實(shí)戰(zhàn)案例

    GO比較兩個(gè)對(duì)象是否相同實(shí)戰(zhàn)案例

    我們時(shí)常有比較兩個(gè)值是否相等的需求,下面這篇文章主要給大家介紹了關(guān)于GO比較兩個(gè)對(duì)象是否相同的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 詳解prometheus監(jiān)控golang服務(wù)實(shí)踐記錄

    詳解prometheus監(jiān)控golang服務(wù)實(shí)踐記錄

    這篇文章主要介紹了詳解prometheus監(jiān)控golang服務(wù)實(shí)踐記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Golang空接口與類型斷言的實(shí)現(xiàn)

    Golang空接口與類型斷言的實(shí)現(xiàn)

    本文主要介紹了Golang空接口與類型斷言的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式

    golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式

    這篇文章主要介紹了golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 使用Golang簡單實(shí)現(xiàn)七牛圖片處理API

    使用Golang簡單實(shí)現(xiàn)七牛圖片處理API

    本文給大家實(shí)現(xiàn)的是使用Golang簡單實(shí)現(xiàn)七牛圖片處理API的方法和步驟,基于PIPE庫實(shí)現(xiàn)的,非常的實(shí)用,有需要的小伙伴可以參考下
    2016-08-08
  • Go語言interface 與 nil 的比較

    Go語言interface 與 nil 的比較

    在golang中,nil只能賦值給指針、channel、func、interface、map或slice類型的變量。如果未遵循這個(gè)規(guī)則,則會(huì)引發(fā)panic。
    2017-08-08
  • Go處理包含多種引號(hào)的字符串的幾種方法

    Go處理包含多種引號(hào)的字符串的幾種方法

    在Go中,有幾種方式可以處理包含多種引號(hào)的字符串,以確保代碼的可讀性和正確性,本文將給大家詳細(xì)介紹了這幾種處理方式,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • go使用errors.Wrapf()代替log.Error()方法示例

    go使用errors.Wrapf()代替log.Error()方法示例

    這篇文章主要為大家介紹了go使用errors.Wrapf()代替log.Error()的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • go 實(shí)現(xiàn)簡易端口掃描的示例

    go 實(shí)現(xiàn)簡易端口掃描的示例

    該功能實(shí)現(xiàn)原理很簡單,就是發(fā)送socket連接(IP+端口),如果能連接成功,說明目標(biāo)主機(jī)開放了某端口。當(dāng)要大量掃描端口時(shí),就需要寫并發(fā)編程了。
    2021-05-05
  • 淺談Go語言中的接口類型

    淺談Go語言中的接口類型

    Go語言中接口是一種抽象的類型,本文主要介紹了淺談Go語言中的接口類型,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08

最新評(píng)論