自定義的Server實例和默認的DefaultServer
Server類型的Accept方法和全局的Accept函數(shù)的作用如下
1. Server 類型的 Accept 方法
Server類型的Accept方法是一個實例方法,用于處理特定的Server實例。它接受一個net.Listener,并為每個新連接啟動一個協(xié)程來處理請求。
-
作用
-
從net.Listener中接受新的連接。
-
為每個新連接啟動一個協(xié)程,調(diào)用server.ServeConn(conn)來處理連接。
-
如果接受連接時發(fā)生錯誤,記錄錯誤并退出循環(huán)。
2. 全局的 Accept 函數(shù)
全局的Accept函數(shù)是一個包裝函數(shù),用于提供默認行為。它調(diào)用了DefaultServer的Accept方法。
-
作用:
-
提供一個全局的Accept函數(shù),方便用戶使用默認的Server實例。
-
如果用戶沒有創(chuàng)建自己的Server實例,可以直接調(diào)用Accept函數(shù)來啟動服務器。
-
3.為什么定義兩個?
-
靈活性:
- Server類型的Accept方法允許用戶創(chuàng)建自己的Server實例,并傳入自定義的Server實例。
- 全局的Accept函數(shù)提供了一個默認的Server實例,方便用戶快速啟動服務器,而不需要手動創(chuàng)建Server實例。
-
默認行為:
- DefaultServer是一個全局的默認Server實例,通常在包初始化時創(chuàng)建。
- 全局的Accept函數(shù)允許用戶在不需要自定義Server實例的情況下,直接使用默認的Server實例。
4.關鍵代碼
type Server struct{}
var DefaultServer = &Server{}
func (server *Server) Accept(lis net.Listener) {
for {
conn, err := lis.Accept()
if err != nil {
log.Println("rpc server: accept error:", err) return } go server.ServeConn(conn)
}
}
func Accept(lis net.Listener) {
DefaultServer.Accept(lis)
}
在main函數(shù)中使用 Server 類型的 Accept 方法
// 創(chuàng)建一個自定義的 Server 實例
server := &Server{}
// 使用自定義的 Server 實例
server.Accept(listener)
在main函數(shù)中使用全局的 Accept 函數(shù)
// 使用默認的 Server 實例
Accept(listener)
Server類型的Accept方法:允許用戶創(chuàng)建自己的Server實例,并傳入自定義的Server實例。
全局的Accept函數(shù):提供一個默認的Server實例,方便用戶快速啟動服務器,而不需要手動創(chuàng)建Server實例。
5.自定義的Server實例和默認的DefaultServer有什么區(qū)別?
自定義的Server實例
自定義的Server實例允許用戶創(chuàng)建自己的Server對象,并根據(jù)需要對其進行配置和擴展。這提供了更高的靈活性和控制權,用戶可以根據(jù)自己的需求定制服務器的行為。
優(yōu)點
用戶可以根據(jù)自己的需求配置服務器的行為,例如設置超時時間、中間件、日志記錄等;用戶可以擴展Server類型,添加自定義的方法和字段,以滿足特定的需求;每個Server實例是獨立的,用戶可以同時運行多個不同的服務器實例,每個實例都有自己的配置和行為。
默認的DefaultServer實例
DefaultServer是一個全局的默認Server實例,通常在包初始化時創(chuàng)建。它提供了一個通用的服務器實例,用戶可以直接使用而無需手動創(chuàng)建和配置。
優(yōu)點
用戶可以直接使用DefaultServer,而無需手動創(chuàng)建和配置服務器實例;DefaultServer提供了一組通用的默認配置,適用于大多數(shù)場景。