Topik wawancara representatif

Wawancara koding: Bagaimana analisis hostport Go 1.25 memperbaiki konstruksi alamat IPv6?

CodingSedang
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Kode membangun alamat net.Dial dengan fmt.Sprintf("%s:%d", host, port). Jelaskan mengapa ini gagal untuk IPv6, perbaiki dengan net.JoinHostPort, dan rancang pengujian untuk IPv4, IPv6, zona, serta port yang tidak valid.

Petunjuk dan konteks

Sebuah layanan membaca host dan port dari konfigurasi lalu meneruskan fmt.Sprintf("%s:%d", host, port) ke net.Dial. Pengujian IPv4 berhasil, tetapi lingkungan produksi mengungkap masalah pada IPv6, alamat link-local, dan penguraian port yang salah format. Perbaiki implementasi di Go 1.25, jelaskan net.JoinHostPort, SplitHostPort, pengidentifikasi zona, dan batasan validasi input, serta diskusikan penganalisis go vet hostport yang baru. Keterampilan intinya adalah pemrograman jaringan portabel, jadi ini adalah pertanyaan coding.

Apa yang dievaluasi oleh pewawancara

Pertama, apakah Anda menyadari bahwa teks IPv6 berisi beberapa tanda titik dua, membuat penggabungan langsung seperti 2001:db8::1:443 menjadi ambigu.

Kedua, apakah Anda menggunakan pustaka standar untuk menambahkan tanda kurung siku sesuai dengan sintaksis alamat jaringan alih-alih percabangan manual.

Ketiga, apakah Anda membedakan string host, pengidentifikasi zona, string port, dan otoritas lengkap sehingga tanda kurung siku dan penguraian tidak terduplikasi.

Keempat, apakah pengujian dan penanganan kesalahan mencakup IPv4, IPv6, %zone, host kosong, dan port tidak valid.

Kelima, apakah go vet digunakan sebagai sinyal sementara tinjauan kode dan pengujian koneksi nyata memverifikasi perbaikan tersebut.

Pertanyaan untuk diklarifikasi terlebih dahulu

  • Apakah host berupa IP murni, nama DNS, otoritas bertanda kurung siku, atau campuran?
  • Apakah port berupa bilangan bulat, string, atau nama layanan? Apakah 0 diperbolehkan?
  • Apakah alamat link-local IPv6 dan zona seperti %eth0 harus didukung?
  • Apakah jaringannya adalah TCP, UDP, atau soket Unix?
  • Haruskah tanda kurung siku dan karakter kontrol dalam input pengguna ditolak?
  • Bisakah CI mengikat pendengar (listener) loopback IPv6?

Jawaban 30 detik

“Penggabungan langsung tidak dapat mengekspresikan batas antara host IPv6 dan port-nya, sehingga 2001:db8::1:443 menjadi ambigu. Saya memvalidasi port, lalu memanggil net.JoinHostPort(host, strconv.Itoa(port)); pustaka standar menghasilkan [host]:port untuk IPv6 dan mempertahankan zona. Saya tidak menambahkan tanda kurung siku secara manual. Jika otoritas lengkap diterima, saya menguraikannya dengan net.SplitHostPort sebelum membangunnya kembali. Pengujian mencakup IPv4, IPv6, %zone, DNS, input kosong, port tidak valid, dan penguraian bolak-balik (round-trip). Penganalisis hostport go vet di Go 1.25 adalah gerbang statis, bukan pengganti pengujian jaringan.”

Solusi terperinci

Langkah 1: Jelaskan kegagalannya

Alamat IPv4 memiliki satu tanda titik dua yang memisahkan host dan port; sedangkan alamat IPv6 mengandung tanda titik dua di dalamnya. Oleh karena itu, teks jaringan IPv6 mengurung host dengan tanda kurung siku, seperti pada [2001:db8::1]:443. Penggabungan langsung tidak memberikan batas, sehingga parser tidak dapat membedakan secara andal apakah titik dua terakhir adalah pemisah port.

Langkah 2: Bangun dengan pustaka standar

Konversi port menjadi string dan panggil net.JoinHostPort. Ketika host mengandung tanda titik dua, fungsi ini menambahkan tanda kurung siku; nama DNS dan IPv4 tetap dalam bentuk biasa. Ini juga mempertahankan pengidentifikasi zona, jadi jangan menambahkan tanda kurung siku atau melakukan escape teks sebelum memanggilnya.

go
func dialAddress(host string, port int) (string, error) {
  if port < 1 || port > 65535 {
    return "", fmt.Errorf("port out of range: %d", port)
  }
  return net.JoinHostPort(host, strconv.Itoa(port)), nil
}

Langkah 3: Tentukan bentuk input

API harus menerima host murni, bukan otoritas yang sudah berisi port. Jika alamat lengkap harus didukung, pertama-tama panggil net.SplitHostPort, normalisasi bagian-bagiannya, dan bangun kembali dengan JoinHostPort. Penggantian string tidak aman untuk IPv6 dan zona.

Langkah 4: Tangani pengidentifikasi zona

Alamat link-local IPv6 dapat berupa fe80::1%eth0, menghasilkan [fe80::1%eth0]:443. Zona membawa cakupan antarmuka dan tidak boleh dihilangkan. Validasi karakter yang diizinkan dan panjangnya agar karakter kontrol atau teks otoritas yang tidak terduga tidak masuk ke dalam log atau konfigurasi hilir.

Langkah 5: Validasi dan uraikan alamat lengkap

Setelah konstruksi, panggil net.SplitHostPort untuk memeriksa reversibilitas dan memastikan bahwa host serta port cocok dengan input. Ini memerlukan alamat jaringan yang memiliki port; port yang hilang, tanda titik dua tambahan, dan tanda kurung siku yang tidak cocok harus mengembalikan kesalahan yang dapat ditindaklanjuti.

Langkah 6: Pahami go vet hostport

Go 1.25 menambahkan penganalisis hostport, yang menandai pola fmt.Sprintf("%s:%d", host, port) yang digunakan untuk membangun alamat bagi net.Dial. Ini menangkap kesalahan umum, tetapi tidak dapat menggantikan kontrak konfigurasi, validasi zona, batasan port, atau pengujian stack jaringan yang sebenarnya.

Langkah 7: Bangun matriks pengujian

Cakup 127.0.0.1:443, [2001:db8::1]:443, [fe80::1%eth0]:443, nama DNS, host kosong, port 0, 65536, nilai negatif, dan input yang sudah bertanda kurung siku. Jika didukung, sambungkan ke pendengar loopback IPv4 dan IPv6; jika tidak, pertahankan pengujian konstruksi dan pemisahan murni serta dokumentasikan kemampuan CI.

Contoh jawaban berkualitas tinggi

“Kecacatannya terletak pada sintaksis alamat, bukan pada Dial: host IPv6 mengandung titik dua, sehingga penggabungan langsung tidak dapat membatasi port. Saya mendefinisikan API sebagai host murni ditambah port integer, memeriksa 1..65535, dan memanggil net.JoinHostPort(host, strconv.Itoa(port)); saya tidak pernah menulis tanda kurung siku secara manual. Jika otoritas lengkap diterima, saya memisahkannya terlebih dahulu dan membangun kembali dari host dan port yang telah dinormalisasi. Saya mempertahankan dan memvalidasi %eth0 untuk alamat link-local. Pengujian mencakup IPv4, IPv6, zona, DNS, port tidak valid, dan penguraian yang dapat dibalik. go vet hostport di Go 1.25 adalah gerbang statis, sementara koneksi loopback IPv4/IPv6 menyediakan cakupan integrasi.”

Kesalahan umum

  • Tetap menggunakan fmt.Sprintf("%s:%d", ...) Batas host dan port IPv6 menjadi ambigu → gunakan net.JoinHostPort.
  • Menambahkan tanda kurung siku ke setiap host secara manual → Format IPv4 dan DNS menjadi salah → biarkan pustaka standar yang menentukannya.
  • Menghilangkan %zone IPv6 link-local mungkin tidak dapat merutekan → pertahankan dan validasi zona.
  • Memperlakukan otoritas lengkap sebagai host murni → Port atau tanda kurung siku terduplikasi → definisikan kontrak input dan pisahkan jika diperlukan.
  • Hanya menguji IPv4 → Jalur kegagalan produksi tetap tidak tercakup → sertakan IPv6, zona, dan pengujian loopback.
  • Hanya mengandalkan go vet → Input kustom dan kegagalan runtime tetap ada → gabungkan pengujian unit, pemisahan, dan koneksi.
  • Melewatkan validasi port → Nilai negatif atau overflow masuk ke konfigurasi → periksa rentang sebelum konstruksi.
  • Mencatat log alamat mentah yang belum divalidasi → Karakter kontrol atau konfigurasi sensitif dapat bocor → normalisasi dan catat bidang terstruktur.

Pertanyaan lanjutan

Pertanyaan lanjutan 1: Apakah JoinHostPort memverifikasi bahwa host adalah IP yang valid?

Fungsi ini menggabungkan host dan port sesuai dengan sintaksis alamat jaringan; ini bukan resolusi DNS atau validasi bisnis penuh. Apakah domain, zona, atau karakter khusus diizinkan bergantung pada kontrak input dan jalur resolver.

Pertanyaan lanjutan 2: Mengapa tidak menggunakan titik dua terakhir saja?

Kompresi IPv6, zona, dan port yang hilang membuat aturan string menjadi rapuh. Pasangan standar Join/Split mengikuti sintaksis alamat dan melaporkan kesalahan tanda kurung siku atau port secara eksplisit.

Pertanyaan lanjutan 3: Bisakah string port diteruskan secara langsung?

Ya, JoinHostPort menerima port string. Ketika input bisnis adalah bilangan bulat, validasi rentangnya dan konversi dengan strconv.Itoa agar nilai negatif atau overflow tidak diformat ke dalam alamat.

Pertanyaan lanjutan 4: Bagaimana zona harus disanitasi?

Pertahankan semantik zona yang diperlukan oleh antarmuka, tetapi batasi rangkaian karakter dan panjangnya. Jangan melakukan pengkodean ganda pada %; catat host dan zona sebagai bidang terstruktur terpisah jika memungkinkan.

Pertanyaan lanjutan 5: Kapan sebaiknya url.URL digunakan sebagai gantinya?

Gunakan url.URL saat membangun URI HTTP atau HTTPS dengan skema, otoritas, dan jalur. Gunakan JoinHostPort untuk host:port yang diteruskan ke net.Dial; jangan menggabungkan URI secara manual.

Pertanyaan lanjutan 6: Bagaimana Anda membuktikan perbaikan tersebut berfungsi dengan IPv6 asli?

Dalam CI yang mendukung IPv6 atau lingkungan khusus, ikat pendengar [::1]:0, baca port yang ditetapkan, dan sambungkan melalui konstruktor yang sama. Pertahankan pengujian fungsi murni untuk lingkungan tanpa IPv6 dan dokumentasikan perbedaannya.

Sumber publik

Pertanyaan terkait

Alat wawancara terkait

Gunakan Tangkapan Layar untuk perintah coding

Ambil tangkapan layar soal, lalu telusuri batasan, solusi, kode, edge case, dan kompleksitas secara berurutan.

Lihat alat