ホームページ > バックエンド開発 > Golang > net/netip での AddrPort の使用: 完全ガイド

net/netip での AddrPort の使用: 完全ガイド

Patricia Arquette
リリース: 2025-01-18 00:14:41
オリジナル
522 人が閲覧しました

Working with AddrPort in net/netip: Complete Guide

net/netip パッケージの探索を続けて、今度は、IP アドレスとポート番号をエレガントに組み合わせた構造である AddrPort に焦点を当てます。このペアリングはネットワーク プログラミングの基礎であり、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. Prefer 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 形式に保ち、必要な場合にのみ文字列に変換します。

次は何ですか?

次の記事では、CIDR 表記とサブネット操作に焦点を当てて Prefix 型について説明し、コアの net/netip 型の探索を完了します。 それまでは、ネットワーク アプリケーションで AddrPort のパワーと効率を活用してください!

以上がnet/netip での AddrPort の使用: 完全ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート