Go 言語の net/netip
パッケージの詳細な説明: Addr
type
皆さん、こんにちは!今日は、net/netip
型に焦点を当てて、Go 言語の Addr
パッケージについて詳しく説明します。 Go のネットワーク コードを使用している場合は、古い net.IP
タイプに遭遇したことがあるかもしれません。これは私たちにとって有益ですが、最新のネットワーク コードには適さないといういくつかの欠点があります。 net/netip
パッケージ (Go 1.18 で導入) は、IP アドレスを処理するためのより強力かつ効率的な方法を提供します。
なぜnet/netip.Addr
を選ぶのですか?
詳細に入る前に、このタイプが存在する理由を理解しましょう。従来の net.IP
型は基本的にバイトのスライス ([]byte
) であり、次のことを意味します:
- 変数
- ヒープ割り当てが必要です
- 無効なステータスが含まれている可能性があります
- 比較に
==
演算子は使用できません
新しい Addr
タイプは、これらの問題をすべて解決します。これは値型 (内部構造) であり、不変であり、常に有効な IP アドレスを表します。もう防御的なプログラミングは必要ありません。
始めましょうAddr
Addr
の作成と使用の基本を見てみましょう:
package main import ( "fmt" "net/netip" ) func main() { // 从字符串创建Addr addr, err := netip.ParseAddr("192.168.1.1") if err != nil { panic(err) } // 如果你绝对确定输入 addr2 := netip.MustParseAddr("2001:db8::1") fmt.Printf("IPv4: %v\nIPv6: %v\n", addr, addr2) }
ParseAddr
の利点の 1 つは、非常に厳密であることです。奇妙な形式や無効なアドレスは受け入れられません。例:
// 这些将会失败 _, err1 := netip.ParseAddr("256.1.2.3") // 无效的IPv4八位字节 _, err2 := netip.ParseAddr("2001:db8::1::2") // 无效的IPv6(双冒号) _, err3 := netip.ParseAddr("192.168.1.1/24") // Addr不允许CIDR表示法
Addr
方法
について詳しく話し合う
Addr
で使用する主なメソッドを見てみましょう。それぞれの方法が役立つ例をいくつか紹介します。
これは IPv4 ですか、それとも IPv6 ですか?
func checkAddressType(addr netip.Addr) { if addr.Is4() { fmt.Println("这是IPv4") // 你可以在这里安全地使用As4() bytes := addr.As4() fmt.Printf("作为字节:%v\n", bytes) } else if addr.Is6() { fmt.Println("这是IPv6") // 你可以在这里安全地使用As16() bytes := addr.As16() fmt.Printf("作为字节:%v\n", bytes) } }
プロのヒント: IPv4 にマップされた IPv6 アドレス (::ffff:192.0.2.1
など) を扱う場合は、Is4In6()
を使用して検出します。これは、プロトコルに依存しないコードを作成する場合に特に便利です。
住所の分類方法
Addr
タイプは、IP アドレスを分類するいくつかの方法を提供します。包括的な例を次に示します:
func classifyAddress(addr netip.Addr) { checks := []struct { name string fn func() bool }{ {"IsGlobalUnicast", addr.IsGlobalUnicast}, {"IsPrivate", addr.IsPrivate}, {"IsLoopback", addr.IsLoopback}, {"IsMulticast", addr.IsMulticast}, {"IsLinkLocalUnicast", addr.IsLinkLocalUnicast}, {"IsLinkLocalMulticast", addr.IsLinkLocalMulticast}, {"IsInterfaceLocalMulticast", addr.IsInterfaceLocalMulticast}, {"IsUnspecified", addr.IsUnspecified}, } for _, check := range checks { if check.fn() { fmt.Printf("地址是 %s\n", check.name) } } }
実践例: ループバック インターフェイスを除くすべてのインターフェイスにバインドする必要があるサービスを作成しているとします。
func getBindableAddresses(addrs []netip.Addr) []netip.Addr { var bindable []netip.Addr for _, addr := range addrs { if !addr.IsLoopback() && !addr.IsLinkLocalUnicast() { bindable = append(bindable, addr) } } return bindable }
使用ゾーン (IPv6 スコープ ID)
IPv6 を使用している場合は、最終的にゾーンに遭遇します。これらは主に、使用するネットワーク インターフェイスを指定するためにリンクローカル アドレスとともに使用されます:
func handleZones() { // 创建一个带有区域的地址 addr := netip.MustParseAddr("fe80::1%eth0") // 获取区域 zone := addr.Zone() fmt.Printf("区域:%s\n", zone) // 比较带有区域的地址 addr1 := netip.MustParseAddr("fe80::1%eth0") addr2 := netip.MustParseAddr("fe80::1%eth1") // 由于区域不同,这些是不同的地址 fmt.Printf("相同的地址?%v\n", addr1 == addr2) // false // WithZone创建一个具有不同区域的新地址 addr3 := addr1.WithZone("eth2") fmt.Printf("新的区域:%s\n", addr3.Zone()) }
実際の応用: IP アドレスフィルター
これらすべてを実際の例にまとめてみましょう。これは、Web サービスに使用できる単純な IP フィルターです:
type IPFilter struct { allowed []netip.Addr denied []netip.Addr } func NewIPFilter(allowed, denied []string) (*IPFilter, error) { f := &IPFilter{} // 解析允许的地址 for _, a := range allowed { addr, err := netip.ParseAddr(a) if err != nil { return nil, fmt.Errorf("无效的允许地址 %s: %w", a, err) } f.allowed = append(f.allowed, addr) } // 解析拒绝的地址 for _, d := range denied { addr, err := netip.ParseAddr(d) if err != nil { return nil, fmt.Errorf("无效的拒绝地址 %s: %w", d, err) } f.denied = append(f.denied, addr) } return f, nil } func (f *IPFilter) IsAllowed(ip string) bool { addr, err := netip.ParseAddr(ip) if err != nil { return false } // 首先检查拒绝列表 for _, denied := range f.denied { if addr == denied { return false } } // 如果没有指定允许的地址,则允许所有未被拒绝的地址 if len(f.allowed) == 0 { return true } // 检查允许列表 for _, allowed := range f.allowed { if addr == allowed { return true } } return false }
使用例:
func main() { filter, err := NewIPFilter( []string{"192.168.1.100", "10.0.0.1"}, []string{"192.168.1.50"}, ) if err != nil { panic(err) } tests := []string{ "192.168.1.100", // 允许 "192.168.1.50", // 拒绝 "192.168.1.200", // 不在任何列表中 } for _, ip := range tests { fmt.Printf("%s 允许?%v\n", ip, filter.IsAllowed(ip)) } }
パフォーマンスノート
net/netip.Addr
の優れた点の 1 つは、そのパフォーマンス機能です。値型なので:
- ヒープ割り当てを行わない基本操作
- 効率的な比較演算
- ゼロ値は無効です (ゼロ値が有効な可能性がある
net.IP
とは異なります)
よくある落とし穴とトリック
-
net.IP
とnetip.Addr
をランダムに混合しないでください。これらの間で変換することは可能ですが、一貫性を保つために、コードベース全体でnetip.Addr
を使用するようにしてください。 - 比較の領域に注意してください 領域に加えて、2 つの同一のアドレスは異なるアドレスとみなされます。
-
使用には注意してください
MustParseAddr
テストまたは初期化コードでは便利ですが、ユーザー入力を処理する運用コードではParseAddr
を使用することを推奨します。 -
不変であることを覚えておいてください アドレスを変更するように見えるすべてのメソッド (
WithZone
など) は、実際には新しいアドレスを返します。
次は何ですか?
この記事では、Addr
型の基本といくつかの高度な使用法について説明しますが、net/netip
パッケージにはさらに多くの内容が含まれています。次の記事では、IP アドレスとポート番号を組み合わせる AddrPort
について説明します。これはネットワーク プログラミングに非常に便利です。
それまではコーディングを楽しんでください!プロジェクトで net/netip.Addr
を使用してご質問がある場合は、お気軽にお問い合わせください。
以上がGo の net/netip アドレス タイプについて: 詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

goisidealforbuildingscalablessystemsduetoitssimplicity、効率性、およびビルド・インコンカレンシsupport.1)

intionSingOrunautomaticallyは()andareuseforstingupenments andinitializingvariables.usemforsimpletasks、回避効果を回避し、測定可能性を測定することを検討します。

goinitializeSpackages intheordertheyareimport extionsitions withinitionsiteintheirdefinition ordord、およびfilenamesdetermineTheOordCrossMultiplefiles.thisprocesccanbeandeanded by -dependenciessedieSiesは、このマイレアドカンフレシニティン化の対象となります

custominterfacesingoarecrucialforwritingfficable、maintable、andtatablecode.theyeNabledeveloveerStofofofovioroverimplementation、拡張、methodsodsignaturesthattypespessmustimment、interfaceforoderueusavelya

シミュレーションとテストにインターフェイスを使用する理由は、インターフェイスにより、実装を指定せずに契約の定義を可能にし、テストをより孤立し、メンテナンスしやすくするためです。 1)インターフェイスの暗黙的な実装により、モックオブジェクトを簡単に作成できます。これにより、テストの実際の実装を置き換えることができます。 2)インターフェイスを使用すると、ユニットテストでのサービスの実際の実装を簡単に置き換えることができ、テストの複雑さと時間を短縮できます。 3)インターフェイスによって提供される柔軟性により、さまざまなテストケースのシミュレートされた動作の変更が可能になります。 4)インターフェイスは、テスト可能なコードを最初から設計し、コードのモジュール性と保守性を向上させるのに役立ちます。

Goでは、init関数はパッケージの初期化に使用されます。 1)init関数は、パッケージの初期化時に自動的に呼び出され、グローバル変数の初期化、接続の設定、構成ファイルの読み込みに適しています。 2)ファイルの順序で実行できる複数のinit関数がある場合があります。 3)それを使用する場合、実行順序、テストの難易度、パフォーマンスへの影響を考慮する必要があります。 4)副作用を減らし、依存関係の注入を使用し、初期化を遅延させることをお勧めします。

go'sselectStatementStreamLinesConcurrentProgrambyMultipLexIngoperations.1)Itallow swaitingonMultipleChanneloperations、実行、exectingThefirstreadyone.2)

コンテキストアンドウェイトグループは、フォーマネングに焦点を合わせており、contextAllowsingSignalingCancellationAndDeadlinesAcrossapiboundariesを採用し、GoroutinesscanSclacefly.2)WaitGroupssynchronizeGoroutines、Allcompletebebroproproproproproproprotinesを保証します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

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

ホットトピック









