Diekspor vs Tidak Diekspor
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 52 dari 68.
Di Go, visibilitas pengenal seperti variabel, fungsi, tipe, dan lainnya dikendalikan oleh konvensi penamaan sederhana. Hal ini menentukan apakah kode dari package lain dapat mengakses pengenalmu.
Identifier yang diekspor diawali dengan huruf kapital dan dapat diakses dari package lain. Anggap identifier tersebut sebagai "publik", siapa pun yang mengimpor package-mu dapat menggunakannya.
// Ini diekspor (publik)
var Name string
func Calculate() int
type Person structIdentifier yang tidak diekspor diawali dengan huruf kecil dan hanya dapat diakses di dalam package yang sama. Identifier ini bersifat "private" untuk package-mu.
// Ini tidak diekspor (bersifat privat)
var age int
func helper() string
type config structKonvensi penamaan ini adalah cara Go mengatur akses tanpa memerlukan kata kunci seperti public atau private. Saat kamu mencoba menggunakan identifier yang tidak diekspor dari package lain, Go akan memberikan error kompilasi karena identifier tersebut tidak terlihat di luar package-nya.
Tantangan
MudahPerbaiki masalah visibilitas dalam package Go dengan membetulkan konvensi penamaan untuk identifier yang diekspor dan tidak diekspor. Kamu akan bekerja dengan skenario simulasi yang melibatkan beberapa package, dengan beberapa identifier yang salah nama sehingga menyebabkan error kompilasi saat diakses dari package lain.
Kamu akan menerima dua input:
- String berisi definisi package dengan format
"package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1"(misalnya,"utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public") - String berisi percobaan akses dengan format
"accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3"(misalnya,"main.helper,main.Calculate,utils.Version")
Tugasmu:
- Urai input pertama dengan memisahkannya berdasarkan tanda pipa untuk mendapatkan definisi setiap package
- Untuk setiap definisi package, pisahkan berdasarkan titik dua untuk mendapatkan nama package dan identifier-nya
- Untuk setiap definisi identifier, pisahkan berdasarkan titik dua untuk mendapatkan nama identifier, tipe, dan visibilitas yang diinginkan
- Buat fungsi bernama
fixIdentifierNameyang menerima nama identifier dan visibilitas yang diinginkan, lalu mengembalikan nama yang sudah diperbaiki:- Jika visibilitasnya
"public", pastikan identifier diawali huruf kapital - Jika visibilitasnya
"private", pastikan identifier diawali huruf kecil
- Jika visibilitasnya
- Tampilkan header analisis package:
"=== PACKAGE VISIBILITY ANALYSIS ===" - Untuk setiap package, tampilkan informasi package:
"Package: [package_name]"- Untuk setiap identifier dalam package:
- Jika nama identifier perlu diperbaiki:
"- [original_name] ([type]) -> [corrected_name] (visibility: [visibility])" - Jika nama identifier sudah benar:
"- [identifier_name] ([type]) (visibility: [visibility]) ✓"
- Jika nama identifier perlu diperbaiki:
- Urai input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan setiap percobaan akses
- Untuk setiap percobaan akses, pisahkan berdasarkan titik untuk mendapatkan package yang melakukan akses dan identifier yang diakses
- Tampilkan header validasi akses:
"=== ACCESS VALIDATION ===" - Untuk setiap percobaan akses, tentukan apakah akses tersebut valid:
- Temukan package yang berisi identifier tersebut
- Periksa apakah nama identifier yang sudah diperbaiki diawali huruf kapital (diekspor)
- Jika identifier diekspor:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✓ ALLOWED (exported)" - Jika identifier tidak diekspor:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✗ DENIED (unexported)" - Jika identifier tidak ada:
"[accessing_package] accessing unknown.[identifier_name]: ✗ NOT FOUND"(tampilkan kataunknownsebagai package; percobaan ini dihitung sebagai akses yang ditolak)
- Hitung dan tampilkan statistik ringkasan:
"=== SUMMARY ===""Total packages analyzed: [number_of_packages]""Total identifiers processed: [total_number_of_identifiers]""Identifiers requiring fixes: [number_of_identifiers_that_needed_fixing]""Access attempts: [number_of_access_attempts]""Allowed accesses: [number_of_allowed_accesses]""Denied accesses: [number_of_denied_accesses]"
- Tampilkan rekomendasi akhir:
- Jika ada identifier yang perlu diperbaiki:
"Recommendation: Fix identifier naming to follow Go conventions" - Jika semua identifier sudah benar:
"All identifiers follow proper Go naming conventions"
- Jika ada identifier yang perlu diperbaiki:
Gunakan package strings untuk memisahkan string input, package fmt untuk output berformat, serta fungsi manipulasi string untuk memeriksa dan mengubah nama identifier. Tantangan ini menunjukkan bagaimana konvensi penamaan Go mengendalikan visibilitas package dan membantumu memahami perbedaan antara identifier yang diekspor dan yang tidak diekspor.
Coba sendiri
package main
import (
"fmt"
"strings"
)
func main() {
// Baca input
var packageDefinitions string
var accessAttempts string
fmt.Scanln(&packageDefinitions)
fmt.Scanln(&accessAttempts)
// TODO: Tulis kodemu di bawah ini
// Buat fungsi fixIdentifierName
// Uraikan definisi package
// Tampilkan analisis package
// Uraikan percobaan akses
// Tampilkan validasi akses
// Hitung dan tampilkan statistik ringkasan
// Tampilkan rekomendasi
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan Perilaku6Go Idiomatis: set
Idiom set dalam GoMembuat setMenambahkan elemen ke setMemeriksa keanggotaanMenghapus elemen dari setMelakukan perulangan pada setUlasan: Nama pengguna unik9Paket dan Lingkup
Apa Itu Paket?Diekspor vs Tidak DieksporMembuat Paket SederhanaAlias PaketIdentifier Kosong `_`Fungsi `init`Ringkasan: Membuat UtilitasLatihan sendiri: Compiler Go online