Menu
CoddyTech

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 struct

Identifier 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 struct

Konvensi 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.

challenge icon

Tantangan

Mudah

Perbaiki 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:

  1. Urai input pertama dengan memisahkannya berdasarkan tanda pipa untuk mendapatkan definisi setiap package
  2. Untuk setiap definisi package, pisahkan berdasarkan titik dua untuk mendapatkan nama package dan identifier-nya
  3. Untuk setiap definisi identifier, pisahkan berdasarkan titik dua untuk mendapatkan nama identifier, tipe, dan visibilitas yang diinginkan
  4. Buat fungsi bernama fixIdentifierName yang 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
  5. Tampilkan header analisis package: "=== PACKAGE VISIBILITY ANALYSIS ==="
  6. 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]) ✓"
    • 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 kata unknown sebagai 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"

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
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online