首頁 >後端開發 >Golang >在 net/netip 中使用 AddrPort:完整指南

在 net/netip 中使用 AddrPort:完整指南

Patricia Arquette
Patricia Arquette原創
2025-01-18 00:14:41524瀏覽

Working with AddrPort in net/netip: Complete Guide

繼續探索 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>

有關連接埠號碼的要點:

  • 必須在 0-65535 範圍內。
  • 儲存為uint16
  • 解析過程中允許使用前導零(「8080」和「08080」是等效的)。

探索 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>

處理 IPv4 和 IPv6 位址

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 擅長的實際場景。

1. 一個簡單的 TCP 伺服器

<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>

2. 服務註冊中心

此範例示範了管理服務及其端點的服務登錄:

<code class="language-go">// ... (ServiceRegistry struct and methods as in the original example) ...</code>

3.負載平衡器配置

以下是如何在負載平衡器配置中使用 AddrPort

<code class="language-go">// ... (LoadBalancer struct and methods as in the original example) ...</code>

常見模式與最佳實務

  1. 輸入驗證:總是驗證使用者提供的輸入:
<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>
  1. 零值處理: AddrPort 的零值無效:
<code class="language-go">func isValidEndpoint(ap netip.AddrPort) bool {
    return ap.IsValid()
}</code>
  1. 字串表示形式: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>

效能注意事項

  1. 首選 AddrPortFrom: 當你已經有一個有效的 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>
  1. 最小化字串轉換:盡可能保持AddrPort格式的位址,僅在必要時轉換為字串。

下一步是什麼?

我們的下一篇文章將介紹Prefix類型,重點在於CIDR表示法和子網路操作,完成我們對核心net/netip類型的探索。 在那之前,請在您的網頁應用程式中利用 AddrPort 的強大功能和效率!

以上是在 net/netip 中使用 AddrPort:完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn