Dışa Aktarılan ve Aktarılmayanlar
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 52 / 68.
Go'da, tanımlayıcıların (değişkenler, fonksiyonlar, tipler vb.) görünürlüğü basit bir isimlendirme kuralı ile kontrol edilir. Bu, diğer paketlerdeki kodların tanımlayıcılarınıza erişip erişemeyeceğini belirler.
Dışa aktarılan tanımlayıcılar büyük bir harfle başlar ve diğer paketlerden erişilebilirler. Bunları "public" olarak düşünebilirsiniz; paketinizi içe aktaran herkes tarafından kullanılabilirler.
// Bunlar dışa aktarılır (public)
var Name string
func Calculate() int
type Person structDışa aktarılmayan tanımlayıcılar küçük harfle başlar ve yalnızca aynı paket içinden erişilebilirler. Bunlar paketiniz için "özel" (private) niteliktedir.
// Bunlar dışa aktarılmamıştır (özel)
var age int
func helper() string
type config structBu isimlendirme kuralı, Go'nun public veya private gibi anahtar kelimelere ihtiyaç duymadan erişimi kontrol etme yöntemidir. Başka bir paketten dışa aktarılmamış bir tanımlayıcıyı kullanmaya çalıştığınızda, Go size bir derleme hatası verecektir çünkü bu tanımlayıcı kendi paketinin dışında görünür değildir.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayDışa aktarılan (exported) ve dışa aktarılmayan (unexported) tanımlayıcılar için adlandırma kuralını düzelterek bir Go paketindeki görünürlük sorunlarını giderin. Bazı tanımlayıcıların yanlış adlandırıldığı ve diğer paketlerden erişildiğinde derleme hatalarına neden olduğu simüle edilmiş çoklu paket senaryosu üzerinde çalışacaksınız.
İki girdi alacaksınız:
"package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1"formatında paket tanımlarını içeren bir dize (örneğin,"utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public")"accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3"formatında erişim girişimlerini içeren bir dize (örneğin,"main.helper,main.Calculate,utils.Version")
Göreviniz şunları yapmaktır:
- Bireysel paket tanımlarını elde etmek için ilk girdiyi dikey çubuk (pipe) karakterlerine göre ayırarak ayrıştırın
- Her paket tanımı için, paket adını ve tanımlayıcılarını elde etmek üzere iki nokta üst üste karakterlerine göre ayırın
- Her tanımlayıcı tanımı için, tanımlayıcı adını, türünü ve hedeflenen görünürlüğü elde etmek üzere iki nokta üst üste karakterlerine göre ayırın
- Bir tanımlayıcı adı ve hedeflenen görünürlüğü alan ve düzeltilmiş adı döndüren
fixIdentifierNameadlı bir fonksiyon oluşturun:- Görünürlük
"public"ise, tanımlayıcının büyük harfle başladığından emin olun - Görünürlük
"private"ise, tanımlayıcının küçük harfle başladığından emin olun
- Görünürlük
- Paket analiz başlığını görüntüleyin:
"=== PACKAGE VISIBILITY ANALYSIS ===" - Her paket için paket bilgilerini görüntüleyin:
"Package: [package_name]"- Paketteki her tanımlayıcı için:
- Tanımlayıcı adının düzeltilmesi gerekiyorsa:
"- [original_name] ([type]) -> [corrected_name] (visibility: [visibility])" - Tanımlayıcı adı doğruysa:
"- [identifier_name] ([type]) (visibility: [visibility]) ✓"
- Tanımlayıcı adının düzeltilmesi gerekiyorsa:
- Bireysel erişim girişimlerini elde etmek için ikinci girdiyi virgüllere göre ayırarak ayrıştırın
- Her erişim girişimi için, erişen paketi ve erişilen tanımlayıcıyı elde etmek üzere noktalara göre ayırın
- Erişim doğrulama başlığını görüntüleyin:
"=== ACCESS VALIDATION ===" - Her erişim girişimi için erişimin geçerli olup olmadığını belirleyin:
- Tanımlayıcıyı içeren paketi bulun
- Düzeltilmiş tanımlayıcı adının büyük harfle başlayıp başlamadığını (dışa aktarılmış) kontrol edin
- Tanımlayıcı dışa aktarılmışsa:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✓ ALLOWED (exported)" - Tanımlayıcı dışa aktarılmamışsa:
"[accessing_package] accessing [target_package].[corrected_identifier_name]: ✗ DENIED (unexported)" - Tanımlayıcı mevcut değilse:
"[accessing_package] accessing [target_package].[identifier_name]: ✗ NOT FOUND"
- Özet istatistikleri sayın ve görüntüleyin:
"=== 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]"
- Nihai önerileri görüntüleyin:
- Düzeltme gerektiren tanımlayıcılar varsa:
"Recommendation: Fix identifier naming to follow Go conventions" - Tüm tanımlayıcılar doğruysa:
"All identifiers follow proper Go naming conventions"
- Düzeltme gerektiren tanımlayıcılar varsa:
Girdi dizelerini ayırmak için strings paketini, formatlanmış çıktı için fmt paketini ve tanımlayıcı adlarını kontrol edip değiştirmek için dize işleme fonksiyonlarını kullanın. Bu zorluk, Go'nun adlandırma kuralının paket görünürlüğünü nasıl kontrol ettiğini gösterir ve dışa aktarılan ile dışa aktarılmayan tanımlayıcılar arasındaki farkı anlamanıza yardımcı olur.
Kopya kağıdı
Go, public veya private gibi açık anahtar kelimeler kullanmadan görünürlüğü isimlendirme kuralları aracılığıyla kontrol eder.
Dışa aktarılan tanımlayıcılar büyük harfle başlar ve diğer paketlerden erişilebilir:
// Bunlar dışa aktarılır (public)
var Name string
func Calculate() int
type Person structDışa aktarılmayan tanımlayıcılar küçük harfle başlar ve yalnızca aynı paket içinden erişilebilir:
// Bunlar dışa aktarılmaz (private)
var age int
func helper() string
type config structDiğer paketlerden dışa aktarılmayan tanımlayıcılara erişmeye çalışmak derleme hatalarına yol açar.
Kendin dene
package main
import (
"fmt"
"strings"
)
func main() {
// Girişi oku
var packageDefinitions string
var accessAttempts string
fmt.Scanln(&packageDefinitions)
fmt.Scanln(&accessAttempts)
// TODO: Kodunuzu aşağıya yazın
// fixIdentifierName fonksiyonunu oluşturun
// Paket tanımlarını ayrıştırın
// Paket analizini görüntüleyin
// Erişim denemelerini ayrıştırın
// Erişim doğrulamasını görüntüleyin
// Özet istatistikleri hesaplayın ve görüntüleyin
// Önerileri görüntüleyin
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar6Deyimsel Go: Kümeler
Go'da Küme DeyimiBir Küme OluşturmaKümeye Eleman EklemeEleman Varlığını Kontrol EtmeKümeden Eleman SilmeKüme Üzerinde YinelemeÖzet - Benzersiz Kullanıcı Adları9Paketler ve Kapsam
Paket Nedir?Dışa Aktarılan ve AktarılmayanlarBasit Bir Paket OluşturmaPaket Takma AdlarıBoş Tanımlayıcı `_``init` FonksiyonuÖzet - Bir Yardımcı Araç Oluşturma