目次
アドレスとポートのコンポーネントへのアクセス
IPv4 および IPv6 アドレスの処理
1. シンプルな TCP サーバー
2. サービスレジストリ
3.ロードバランサーの構成
ホームページ バックエンド開発 Golang net/netip での AddrPort の使用: 完全ガイド

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

Jan 18, 2025 am 12:14 AM

Working with AddrPort in net/netip: Complete Guide

net/netip パッケージの探索を続けて、今度は、IP アドレスとポート番号をエレガントに組み合わせた構造である AddrPort に焦点を当てます。このペアリングはネットワーク プログラミングの基礎であり、Web サーバー、データベース接続、および事実上すべてのネットワーク サービスにとって重要です。

AddrPort を使用する理由

net/netip が登場する前は、IP とポートの組み合わせの管理には文字列操作が含まれることが多く、解析が複雑になり、エラーが発生する可能性がありました。 AddrPort は、合理化されたタイプセーフな代替手段を提供します。

AddrPort の使用を開始する

基本から始めましょう:

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)
}
ログイン後にコピー

ポート番号に関する重要なポイント:

  • 0 ~ 65535 の範囲内である必要があります。
  • uint16として保存されます。
  • 解析中に先頭のゼロが許可されます (「8080」と「08080」は同等です)。

AddrPort メソッドの探索

AddrPort で使用できるメソッドとそのアプリケーションを調べてみましょう。

アドレスとポートのコンポーネントへのアクセス

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)
}
ログイン後にコピー

IPv4 および IPv6 アドレスの処理

AddrPort は、IPv4 と IPv6 の両方をシームレスにサポートします:

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)
}
ログイン後にコピー

AddrPort の実際のアプリケーション

AddrPort が優れている実際的なシナリオを見てみましょう。

1. シンプルな TCP サーバー

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...
}
ログイン後にコピー

2. サービスレジストリ

この例は、サービスとそのエンドポイントを管理するサービス レジストリを示しています。

// ... (ServiceRegistry struct and methods as in the original example) ...
ログイン後にコピー

3.ロードバランサーの構成

ロードバランサー構成で AddrPort を使用する方法は次のとおりです。

// ... (LoadBalancer struct and methods as in the original example) ...
ログイン後にコピー

一般的なパターンとベストプラクティス

  1. 入力の検証: ユーザー提供の入力を常に検証します:
func validateEndpoint(input string) error {
    _, err := netip.ParseAddrPort(input)
    if err != nil {
        return fmt.Errorf("invalid endpoint %q: %w", input, err)
    }
    return nil
}
ログイン後にコピー
  1. ゼロ値の処理: AddrPort のゼロ値は無効です:
func isValidEndpoint(ap netip.AddrPort) bool {
    return ap.IsValid()
}
ログイン後にコピー
  1. 文字列表現: AddrPort を文字列として保存する場合 (構成ファイルなど):
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
}
ログイン後にコピー

標準ライブラリとの統合

AddrPort は標準ライブラリとシームレスに統合します:

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)
}
ログイン後にコピー

パフォーマンスに関する考慮事項

  1. Prefer AddrPortFrom: 有効な Addr がすでにある場合は、効率を高めるために文字列解析の代わりに AddrPortFrom を使用します:
addr := netip.MustParseAddr("192.168.1.1")
ap := netip.AddrPortFrom(addr, 8080) // More efficient than parsing "192.168.1.1:8080"
ログイン後にコピー
  1. 文字列変換を最小限に抑える: アドレスを可能な限り AddrPort 形式に保ち、必要な場合にのみ文字列に変換します。

次は何ですか?

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

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

ゴーを始めましょう:初心者のガイド ゴーを始めましょう:初心者のガイド Apr 26, 2025 am 12:21 AM

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

Golang vs. C:パフォーマンスと速度の比較 Golang vs. C:パフォーマンスと速度の比較 Apr 21, 2025 am 12:13 AM

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

See all articles