繼續探索 net/netip
包,我們現在關注 AddrPort
,一個優雅地組合 IP 位址和連接埠號碼的結構。這種配對是網路程式設計的基礎,對於 Web 伺服器、資料庫連接和幾乎任何網路服務都至關重要。
為什麼要使用AddrPort?
在 net/netip
之前,管理 IP:連接埠組合通常涉及字串操作,導致解析複雜性和潛在錯誤。 AddrPort
提供了一種簡化的、類型安全的替代方案。
AddrPort 入門
讓我們從基礎開始:
<code class="language-go">package main import ( "fmt" "net/netip" ) func main() { // Create from a string ap1, err := netip.ParseAddrPort("192.168.1.1:8080") if err != nil { panic(err) } // Create from Addr and port addr := netip.MustParseAddr("192.168.1.1") ap2 := netip.AddrPortFrom(addr, 8080) fmt.Printf("From string: %v\nFrom components: %v\n", ap1, ap2) }</code>
有關連接埠號碼的要點:
uint16
。 探索 AddrPort 方法
讓我們檢查一下 AddrPort
可用的方法及其應用程式。
<code class="language-go">func examineAddrPort(ap netip.AddrPort) { // Retrieve the address component addr := ap.Addr() fmt.Printf("Address: %v\n", addr) // Retrieve the port number port := ap.Port() fmt.Printf("Port: %d\n", port) // Obtain the string representation ("<addr>:<port>") str := ap.String() fmt.Printf("String representation: %s\n", str) }</code>
AddrPort
無縫支援IPv4和IPv6:
<code class="language-go">func handleBothIPVersions() { // IPv4 with port ap4 := netip.MustParseAddrPort("192.168.1.1:80") // IPv6 with port ap6 := netip.MustParseAddrPort("[2001:db8::1]:80") // Note: Brackets are required for IPv6 addresses. "2001:db8::1:80" would fail. // IPv6 with zone and port apZone := netip.MustParseAddrPort("[fe80::1%eth0]:80") fmt.Printf("IPv4: %v\n", ap4) fmt.Printf("IPv6: %v\n", ap6) fmt.Printf("IPv6 with zone: %v\n", apZone) }</code>
AddrPort 的實際應用
讓我們來探索 AddrPort
擅長的實際場景。
<code class="language-go">func runServer(ap netip.AddrPort) error { listener, err := net.Listen("tcp", ap.String()) if err != nil { return fmt.Errorf("failed to start server: %w", err) } defer listener.Close() fmt.Printf("Server listening on %v\n", ap) for { conn, err := listener.Accept() if err != nil { return fmt.Errorf("accept failed: %w", err) } go handleConnection(conn) } } func handleConnection(conn net.Conn) { defer conn.Close() // Handle the connection... }</code>
此範例示範了管理服務及其端點的服務登錄:
<code class="language-go">// ... (ServiceRegistry struct and methods as in the original example) ...</code>
以下是如何在負載平衡器配置中使用 AddrPort
:
<code class="language-go">// ... (LoadBalancer struct and methods as in the original example) ...</code>
常見模式與最佳實務
<code class="language-go">func validateEndpoint(input string) error { _, err := netip.ParseAddrPort(input) if err != nil { return fmt.Errorf("invalid endpoint %q: %w", input, err) } return nil }</code>
AddrPort
的零值無效:<code class="language-go">func isValidEndpoint(ap netip.AddrPort) bool { return ap.IsValid() }</code>
AddrPort
儲存為字串時(例如,在設定檔中):<code class="language-go">func saveConfig(endpoints []netip.AddrPort) map[string]string { config := make(map[string]string) for i, ep := range endpoints { key := fmt.Sprintf("endpoint_%d", i) config[key] = ep.String() } return config }</code>
與標準庫整合
AddrPort
與標準函式庫無縫整合:
<code class="language-go">func dialService(endpoint netip.AddrPort) (net.Conn, error) { return net.Dial("tcp", endpoint.String()) } func listenAndServe(endpoint netip.AddrPort, handler http.Handler) error { return http.ListenAndServe(endpoint.String(), handler) }</code>
效能注意事項
Addr
時,使用 AddrPortFrom
代替字串解析以提高效率:<code class="language-go">addr := netip.MustParseAddr("192.168.1.1") ap := netip.AddrPortFrom(addr, 8080) // More efficient than parsing "192.168.1.1:8080"</code>
AddrPort
格式的位址,僅在必要時轉換為字串。 下一步是什麼?
我們的下一篇文章將介紹Prefix
類型,重點在於CIDR表示法和子網路操作,完成我們對核心net/netip
類型的探索。 在那之前,請在您的網頁應用程式中利用 AddrPort
的強大功能和效率!
以上是在 net/netip 中使用 AddrPort:完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!