cari
Rumahpembangunan bahagian belakangGolangMemahami Jenis Addr Go's net/netip: A Deep Dive

Understanding Go

Penjelasan terperinci tentang pakej

Go language net/netip: Addrtaip

Hello semua! Hari ini kita akan menyelidiki pakej net/netip bahasa Go, memfokuskan pada jenis Addr. Jika anda telah menggunakan kod rangkaian Go, anda mungkin pernah menemui jenis net.IP lama. Walaupun ia telah memberi manfaat kepada kami, ia mempunyai beberapa kelemahan yang menjadikannya kurang sesuai untuk kod rangkaian moden. Pakej net/netip (diperkenalkan dalam Go 1.18) memberi kita cara yang lebih berkuasa dan cekap untuk mengendalikan alamat IP.

Mengapa memilihnet/netip.Addr?

Sebelum kita masuk ke butiran, mari kita fahami sebab jenis ini wujud. Jenis net.IP tradisional pada asasnya ialah sekeping bait ([]byte), yang bermaksud:

  • Pembolehubah
  • Memerlukan peruntukan timbunan
  • Mungkin mengandungi status tidak sah
  • Tidak boleh menggunakan operator == untuk perbandingan

Jenis Addr baharu menyelesaikan semua masalah ini. Ia ialah jenis nilai (struktur dalaman), tidak boleh diubah, dan sentiasa mewakili alamat IP yang sah. Tiada lagi pengaturcaraan defensif!

MulakanAddr

Mari kita lihat asas mencipta dan menggunakan 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)
}
Satu kelebihan

ParseAddr ialah ia sangat ketat. Ia tidak akan menerima format pelik atau alamat tidak sah. Contohnya:

// 这些将会失败
_, 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表示法

Bincangkan secara mendalam Addrkaedah

Mari teroka kaedah utama yang akan anda gunakan dengan Addr. Saya akan berkongsi beberapa contoh praktikal di mana setiap kaedah berguna.

Adakah ini IPv4 atau 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)
    }
}

Petua Pro: Apabila berurusan dengan alamat IPv6 dipetakan IPv4 (seperti ::ffff:192.0.2.1), gunakan Is4In6() untuk mengesannya. Ini amat berguna apabila menulis kod protokol-agnostik.

Kaedah pengelasan alamat

Jenis

Addr menyediakan beberapa cara untuk mengklasifikasikan alamat IP. Berikut ialah contoh menyeluruh:

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

Contoh praktikal: Katakan anda sedang menulis perkhidmatan yang perlu terikat pada semua antara muka kecuali antara muka gelung balik:

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
}

Gunakan zon (ID skop IPv6)

Jika anda menggunakan IPv6, anda akhirnya akan menghadapi zon. Ia digunakan terutamanya dengan alamat pautan-tempatan untuk menentukan antara muka rangkaian yang hendak digunakan:

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())
}

Aplikasi Praktikal: Penapis Alamat IP

Mari kita letakkan semua ini dalam contoh praktikal. Ini ialah penapis IP mudah yang boleh digunakan untuk perkhidmatan web:

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
}

Contoh penggunaan:

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

Nota Prestasi

Salah satu perkara hebat tentang

net/netip.Addr ialah ciri prestasinya. Memandangkan ia adalah jenis nilai:

  • Operasi asas tanpa peruntukan timbunan
  • Operasi perbandingan yang cekap
  • Nilai sifar adalah tidak sah (tidak seperti net.IP, di mana nilai sifar mungkin sah)

Beberapa perangkap dan muslihat biasa

  1. Jangan campurkan net.IP dan netip.Addr secara rawak Walaupun anda boleh menukar antara keduanya, demi ketekalan, cuba kekalkan dengan netip.Addr di seluruh pangkalan kod anda.
  2. Perhatikan kawasan dalam perbandingan Selain kawasan itu, dua alamat yang sama dianggap sebagai alamat yang berbeza.
  3. Gunakan dengan berhati-hati MustParseAddr Walaupun mudah dalam ujian atau kod permulaan, pilih ParseAddr dalam kod pengeluaran yang mengendalikan input pengguna.
  4. Ingat ia tidak boleh diubah Semua kaedah yang kelihatan untuk mengubah suai alamat (seperti WithZone) sebenarnya mengembalikan alamat baharu.

Apa yang seterusnya?

Artikel ini merangkumi perkara asas dan beberapa penggunaan lanjutan bagi jenis Addr, tetapi banyak lagi yang perlu diterokai dalam pakej net/netip. Dalam artikel seterusnya, kita akan melihat AddrPort, yang menggabungkan alamat IP dengan nombor port - sangat berguna untuk pengaturcaraan rangkaian.

Sehingga itu, selamat mengekod! Jika anda mempunyai sebarang soalan menggunakan net/netip.Addr dalam projek anda, sila hubungi kami.

Atas ialah kandungan terperinci Memahami Jenis Addr Go's net/netip: A Deep Dive. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Golang dan Python: Memahami PerbezaanGolang dan Python: Memahami PerbezaanApr 18, 2025 am 12:21 AM

Perbezaan utama antara Golang dan Python adalah model konvensional, sistem jenis, prestasi dan kelajuan pelaksanaan. 1. Golang menggunakan model CSP, yang sesuai untuk tugas serentak yang tinggi; Python bergantung pada multi-threading dan gil, yang sesuai untuk tugas I/O-intensif. 2. Golang adalah jenis statik, dan Python adalah jenis dinamik. 3. Golang mengumpulkan kelajuan pelaksanaan bahasa adalah cepat, dan pembangunan bahasa yang ditafsirkan Python adalah pantas.

Golang vs C: Menilai perbezaan kelajuanGolang vs C: Menilai perbezaan kelajuanApr 18, 2025 am 12:20 AM

Golang biasanya lebih perlahan daripada C, tetapi Golang mempunyai lebih banyak kelebihan dalam pengaturcaraan serentak dan kecekapan pembangunan: 1) Koleksi sampah Golang dan model konkurensi menjadikannya berfungsi dengan baik dalam senario konvensyen yang tinggi; 2) C memperoleh prestasi yang lebih tinggi melalui pengurusan memori manual dan pengoptimuman perkakasan, tetapi mempunyai kerumitan pembangunan yang lebih tinggi.

Golang: bahasa utama untuk pengkomputeran awan dan devOpsGolang: bahasa utama untuk pengkomputeran awan dan devOpsApr 18, 2025 am 12:18 AM

Golang digunakan secara meluas dalam pengkomputeran awan dan devOps, dan kelebihannya terletak pada kesederhanaan, kecekapan dan keupayaan pengaturcaraan serentak. 1) Dalam pengkomputeran awan, Golang dengan cekap mengendalikan permintaan serentak melalui mekanisme goroutine dan saluran. 2) Di DevOps, kompilasi cepat Golang dan ciri-ciri silang platform menjadikannya pilihan pertama untuk alat automasi.

Golang dan C: Memahami kecekapan pelaksanaanGolang dan C: Memahami kecekapan pelaksanaanApr 18, 2025 am 12:16 AM

Golang dan C masing -masing mempunyai kelebihan sendiri dalam kecekapan prestasi. 1) Golang meningkatkan kecekapan melalui pengumpulan goroutine dan sampah, tetapi boleh memperkenalkan masa jeda. 2) C menyedari prestasi tinggi melalui pengurusan memori manual dan pengoptimuman, tetapi pemaju perlu menangani kebocoran memori dan isu -isu lain. Apabila memilih, anda perlu mempertimbangkan keperluan projek dan timbunan teknologi pasukan.

Golang vs Python: Konvensyen dan MultithreadingGolang vs Python: Konvensyen dan MultithreadingApr 17, 2025 am 12:20 AM

Golang lebih sesuai untuk tugas -tugas kesesuaian yang tinggi, sementara Python mempunyai lebih banyak kelebihan dalam fleksibiliti. 1.Golang dengan cekap mengendalikan kesesuaian melalui goroutine dan saluran. 2. Pilihannya harus berdasarkan keperluan khusus.

Golang dan C: Perdagangan dalam prestasiGolang dan C: Perdagangan dalam prestasiApr 17, 2025 am 12:18 AM

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

Golang vs Python: Aplikasi dan Kes GunakanGolang vs Python: Aplikasi dan Kes GunakanApr 17, 2025 am 12:17 AM

PilihgolangforhighperformanceandConcurrency, IdealForBackEndServicesandnetworkprogramming; SelectPythonForrapidDevelopment, datascience, danMachinelearningDuetoitSversativilityAndextiveLibraries.

Golang vs Python: Perbezaan dan Persamaan UtamaGolang vs Python: Perbezaan dan Persamaan UtamaApr 17, 2025 am 12:15 AM

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.