net/netip での AddrPort の使用: 完全ガイド
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) ...
一般的なパターンとベストプラクティス
- 入力の検証: ユーザー提供の入力を常に検証します:
func validateEndpoint(input string) error { _, err := netip.ParseAddrPort(input) if err != nil { return fmt.Errorf("invalid endpoint %q: %w", input, err) } return nil }
- ゼロ値の処理:
AddrPort
のゼロ値は無効です:
func isValidEndpoint(ap netip.AddrPort) bool { return ap.IsValid() }
- 文字列表現:
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) }
パフォーマンスに関する考慮事項
- 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"
-
文字列変換を最小限に抑える: アドレスを可能な限り
AddrPort
形式に保ち、必要な場合にのみ文字列に変換します。
次は何ですか?
次の記事では、CIDR 表記とサブネット操作に焦点を当てて Prefix
型について説明し、コアの net/netip
型の探索を完了します。 それまでは、ネットワーク アプリケーションで AddrPort
のパワーと効率を活用してください!
以上がnet/netip での AddrPort の使用: 完全ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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