Yavuzlar
Ana sayfaTelegram
  • Yavuzlar
  • VulnLab
  • CodinLab
  • 📚EĞİTİM
    • PHP
      • XAMPP kurulumu
      • VS Code Kurulum
      • 1.0 PHP Nedir
      • 1.1 Dosya Oluşturma
      • 1.2 Syntax (Yazım Kuralları)
      • 1.3 PHP'de Echo ve Print
      • 1.4 PHP'deki yorumlar
      • 1.5 PHP Değişkenleri
      • 1.6 Operatörler (Operators)
      • 1.7 Veri Türünü Alma
      • 1.8 PHP'de String
      • 1.9 PHP'de Sabitler
      • 2.0 PHP'de If Else Elseif
      • 2.1 Switch Case
      • 2.2 PHP'de Döngüler
      • 2.3 PHP'de Diziler (Arrays)
      • 2.4 PHP'de Süper Global Değişkenleri
      • 2.5 PHP'de Cookie (Çerez) Ve Session (Oturum) Yöntemleri
      • 2.6 Form işlemleri
    • C++
      • 1.0 Temeller
        • 1.1 Dosya Oluşturma
        • 1.2 Syntax (Yazım Kuralları)
        • 1.3 Yorum Satırları
        • 1.4 C++ Değişkenleri
          • 1.4.1 Değişken Türleri
        • 1.5 Operatörler (Operators)
        • 1.6 Namespace
        • 1.7 Kullanıcı Girdisi (User Input)
        • 1.8 C++ Stringleri (C++ Strings)
        • 1.9 Matematik (Math) Fonksiyonları
        • 1.10 Booleans
        • 1.11 If Else
        • 1.12 Switch
        • 1.13 While Döngüsü
          • 1.13.1 Do While Döngüsü
        • 1.14 For Döngüsü
        • 1.15 Break/Continue
        • 1.16 Diziler
        • 1.17 Structures
        • 1.18 Enums
        • 1.19 References
        • 1.20 Pointers
      • 2.0 Fonksiyonlar
      • 3.0 Sınıflar
        • 3.1 OOP
        • 3.2 Sınıflar ve Objeler
        • 3.3 Sınıf Methodları
        • 3.4 Yapıcılar (Constructors)
        • 3.5 Erişim Belirleyicileri (Access Specifiers)
        • 3.6 Kapsülleme (Encapsulation)
        • 3.7 Inheritance
        • 3.8 Polimorfizm (Polymorphism)
        • 3.9 Dosyalar (Files)
        • 3.10 İstisnalar (Exceptions)
        • 3.11 Tarih ve Zaman (Date and Time)
      • 4.0 Veri Yapıları (Data Structures)
        • 4.1 Veri Yapıları ve STL
        • 4.2 Vektörler (Vectors)
        • 4.3 Listeler (Lists)
        • 4.4 Yığınlar (Stacks)
        • 4.5 Kuyruklar (Queues)
        • 4.6 Deque (Çift Uçlu Kuyruk)
        • 4.7 Küme (Set)
        • 4.8 Maps
        • 4.9 Iterator
        • 4.10 Algoritmalar
  • 🛠️ARAÇLAR
    • Aircrack-ng
    • Airgeddon
    • Arjun
    • BeEF
    • Bettercap
    • Docker
    • Gelişmiş Wireshark Kullanımı (Advanced Wireshark Usage)
    • Google Dorks
    • Hping3
    • John the Ripper
    • Metasploit Framework
    • Netcat
    • Nmap
    • OSINT Framework
    • PEASS-ng
    • Sublist3r
    • XSS Scanner
    • Wireshark
    • ZAP
    • HYDRA
  • 🖥️İŞLETİM SİSTEMLERİ
    • Linux101
    • MBR
  • 🔑KRİPTOLOJİ
    • Dijital Sertifika ve İmzalar
    • Sezar Şifrelemesi
    • Steganografi
    • Veri Şifreleme (Data Encryption)
  • 🔏Network
    • Domain Name Server (DNS)
    • Firewall Nedir? Nasıl Çalışır ?
    • Ortadaki Adam Saldırısı (Man In The Middle Attack)
    • OSI Modeli
    • Sanal Özel Ağlar (VPN)
    • World Wide Web (WWW)
  • 🔐PRIVILEGED
    • Docker Escape
  • 📨Protokoller
    • ARP
    • DHCP
    • FTP
    • HTTP/HTTPS
    • SSH
    • TCP/IP
    • UDP
    • Wİ-Fİ Güvenlik Protokolleri (WEP/WPA/WPA2/WPA3)
  • 💻SİBER TEHDİT İSTİHBARATI
    • Gelişmiş Siber Tehdit İstihbaratı Nedir?
  • 🔒WEB GÜVENLİĞİ
    • 403 ByPass
    • API Güvenliği (API Security)
    • Broken Access Control
    • Bulut Güvenliği (Cloud Security)
    • Command Injection
    • Cross Origin Resource Sharing
    • Cross Site Request Forgery (CSRF)
    • Cyber Kill Chain
    • DDoS Saldırıları
    • File Upload Zafiyeti Nedir?
    • HTTP Request Smuggling
    • Insecure Direct Object Reference (IDOR)
    • Incident Response
    • Local File Inclusion (LFI)
    • NoSQL Injection
    • Pentest 101
    • Race Condition
    • Server Side Request Forgery (SSRF)
    • Server Side Template Injection (SSTI)
    • Spring4Shell
    • Two Factor Authentication Bypass
    • XML External Entity Attack (XEE)
  • 🤖YAPAY ZEKA
    • ChatGPT for Hacking
    • Siber Güvenlik ve Yapay Zeka
    • Yapay Zeka ile Sahte Fotoğraf Tespiti
  • 🌐YAZILIM
    • Düzenli İfadeler (Regular Expressions)
    • Elasticsearch Nedir?
    • Front-end Teknolojileri
    • Golang'da Arayüzler (Interfaces)
    • Go'da Concurrency ve Uygulamaları
    • Güvenli Kodlama (Secure Coding)
    • Java Overloading vs Overriding
    • JSON Web Token (JWT)
    • Material-UI
    • NextJS Nedir?
    • ReactJS Kancalar (Hooks)
    • ReactJS Nedir?
    • Redux Toolkit
    • SOLID Yazılım Geliştirme Prensipleri
    • SQL 101
    • UI / UX Nedir?
    • Veri Taşıma Nedir? (Database Migration)
    • Versiyon Kontrol Sistemleri ve GIT
  • 🔷DİĞER
    • Bug Bounty (Hata Ödülü) Nedir?
    • Popüler Yazılımların Kurulumları
      • Ubuntu Server 24.04 LTS Kurulumu
      • Ubuntu için Güncel Docker Engine Kurlumu
    • Güvenlik Operasyonları Merkezi Nedir?
    • Honeypot (Bal Küpü)
    • IoT Güvenliği Nedir?
    • ShellShock Exploit
    • Yük Dengeleyici (Load Balancer) Nedir?
Powered by GitBook
On this page
  • Arayüz Nedir?
  • Arayüz Oluşturma
  • Arayüzlerle Neler Yapılabilir?
  • Arayüzlerle İlgili Önemli Noktalar:
  • Arayüz ile Türlerin Güvenli Dönüşümleri
  • Sonuç

Was this helpful?

  1. YAZILIM

Golang'da Arayüzler (Interfaces)

Golang, basit ve güçlü bir programlama dili olmasının yanı sıra arayüzler aracılığıyla esnek ve modüler kod yazma imkanı da sunar. Bu yazıda, arayüz (interface) temellerini, nasıl oluşturulduğunu ve kullanıldığını detaylı bir şekilde inceleyeceğiz.

Arayüz Nedir?

Arayüz, bir türün sahip olması gereken yöntemlerin bir listesini tanımlar. Farklı türler bu arayüzü uygulayarak, arayüzde tanımlanan tüm yöntemleri kendi veri yapılarına ve işlevlerine göre özelleştirebilir. Bu sayede farklı türler arasında tutarlı bir API oluşturmak ve kodun modülerliğini ve tekrar kullanılabilirliğini artırmak mümkün olur.

Arayüz Oluşturma

interface anahtar sözcüğü kullanılarak yeni bir arayüz tanımlayabilirsiniz. Arayüz, bir veya birden fazla metodu içerir. Metod, metod adını, parametrelerini ve dönüş değerini belirtir.

type Motor interface {
    Calistir(surucuAdı string)
    Durdur(surucuAdı string)
}

Burada Motor adında bir arayüz oluşturduk ve bu arayüzümüzün surucuAdı parametresini alan iki metodu bulunmakta. Şimdi bu arayüzümüzü tır ve araba adındaki iki türlerimize uygulayalım:

package main

import "fmt"

type Motor interface {
    Calistir(surucuAdı string)
    Durdur(surucuAdı string)
}


// Araba ve Otobus tipleri Motor arayüzünü uygulamaktadır.
type Araba struct {
    Plaka string
}

func (a Araba) Calistir(surucuAdı string) {
    fmt.Println(a.Plaka, "plakalı araba", surucuAdı, "tarafından çalıştırıldı")
}


func (a Araba) Durdur(surucuAdı string) {
    fmt.Println(a.Plaka, "plakalı araba", surucuAdı, "tarafından durduruldu")
}


type Otobus struct {
    Plaka string
}

func (o Otobus) Calistir(surucuAdı string) {
    fmt.Println(o.Plaka, "plakalı otobüs", surucuAdı, "tarafından çalıştırıldı")
}
func (o Otobus) Durdur(surucuAdı string) {
    fmt.Println(o.Plaka, "plakalı otobüs", surucuAdı, "tarafından durduruldu")
}


func main() {
    araba := Araba{Plaka: "34ABC123"} // Araba tipinde bir nesne oluşturduk
    otobus := Otobus{Plaka: "34DEF456"} // Otobus tipinde bir nesne oluşturduk
    var motor Motor // Motor arayüzü tipinde bir değişken tanımladık
    motor = araba // motor değişkenine araba nesnesini atadık
    motor.Calistir("Ahmet") // motor değişkeni üzerinden Calistir metodunu çağırdık
    motor.Durdur("Ahmet") // motor değişkeni üzerinden Durdur metodunu çağırdık
    motor = otobus // motor değişkenine otobus nesnesini atadık
    motor.Calistir("Mehmet") // motor değişkeni üzerinden Calistir metodunu çağırdık
    motor.Durdur("Mehmet") // motor değişkeni üzerinden Durdur metodunu çağırdık
    
}

Output

34ABC123 plakalı araba Ahmet tarafından çalıştırıldı
34ABC123 plakalı araba Ahmet tarafından durduruldu
34DEF456 plakalı otobüs Mehmet tarafından çalıştırıldı
34DEF456 plakalı otobüs Mehmet tarafından durduruldu

Arayüzlerle Neler Yapılabilir?

Arayüzler aşağıdakiler için kullanılabilir:

  • Farklı türler arasında tutarlı bir şekilde etkileşime girmek: Bir türün arayüzü uyguladığını biliyorsanız o türle belirli bir şekilde etkileşime girebilirsiniz. Bu, kodunuzu daha soyut ve yeniden kullanılabilir hale getirir.

  • Polimorfizmi uygulamak: Farklı türlerin aynı arayüzü uyguladığı durumlarda bu türleri tek bir koleksiyonda saklayabilir ve onlarla tek bir şekilde etkileşime girebilirsiniz.

Arayüzlerle İlgili Önemli Noktalar:

  • Bir tür birden fazla arayüzü uygulayabilir.

package main

import "fmt"

type Motor interface {
    Calistir(surucuAdı string)
    Durdur(surucuAdı string)
}


type Klima interface {
    KlimaAc()
    KlimaKapat()
}


// Araba tipi Motor ve Klima arayüzlerini uyguladığı için Araba tipi Motor ve Klima arayüzlerine atayabiliyoruz
type Araba struct {
    Plaka string
}

func (a Araba) Calistir(surucuAdı string) {
    fmt.Println(a.Plaka, "plakalı araba", surucuAdı, "tarafından çalıştırıldı")
}

func (a Araba) Durdur(surucuAdı string) {
    fmt.Println(a.Plaka, "plakalı araba", surucuAdı, "tarafından durduruldu")
}

func (a Araba) KlimaAç() {
    fmt.Println(a.Plaka, "plakalı araba kliması açıldı")
}

func (a Araba) KlimaKapat() {
    fmt.Println(a.Plaka, "plakalı araba kliması kapatıldı")
}


func main() {
    araba := Araba{Plaka: "34ABC123"} // Araba tipinde bir nesne oluşturduk
    var motor Motor // Motor arayüzü tipinde bir değişken tanımladık
    var klima Klima // Klima arayüzü tipinde bir değişken tanımladık
    klima = araba // Araba tipi Klima arayüzünü uyguladığı için klima değişkenine atayabildik
    motor = araba // Araba tipi Motor arayüzünü uyguladığı için motor değişkenine atayabildik
    motor.Calistir("Ahmet") // 34ABC123 plakalı araba Ahmet tarafından çalıştırıldı
    motor.Durdur("Mehmet") // 34ABC123 plakalı araba Mehmet tarafından durduruldu
    klima.KlimaAç() // 34ABC123 plakalı araba kliması açıldı
    klima.KlimaKapat() // 34ABC123 plakalı araba kliması kapatıldı
}

Output:

34ABC123 plakalı araba Ahmet tarafından çalıştırıldı
34ABC123 plakalı araba Ahmet tarafından durduruldu
34DEF456 plakalı otobüs Mehmet tarafından çalıştırıldı
34DEF456 plakalı otobüs Mehmet tarafından durduruldu
  • Arayüzler değer türleri veya referans türleri olabilir.

package main

import "fmt"

type Motor interface {
    Calistir(surucuAdı string)
    Durdur(surucuAdı string)
}

type Araba struct {
    Plaka string
}

func (a Araba) Calistir(surucuAdı string) {
    fmt.Println(a.Plaka, "plakalı araba", surucuAdı, "tarafından çalıştırıldı")
}
func (a Araba) Durdur(surucuAdı string) {
    fmt.Println(a.Plaka, "plakalı araba", surucuAdı, "tarafından durduruldu")
}


func main() {
    araba := Araba{Plaka: "34ABC123"} // Araba tipinde bir nesne oluşturduk
    var motor1 Motor = araba // Araba tipi Motor arayüzüne atandı (Değer türü)
    var motor2 Motor = &araba // Araba tipi Motor arayüzüne atandı (Referans türü)
    motor1.Calistir("Ahmet") // motor1 değişkeni üzerinden Calistir fonksiyonu çağrıldı
    motor1.Calistir("Mehmet") // motor2 değişkeni üzerinden Calistir fonksiyonu çağrıldı
    araba.Plaka = "DEĞİŞTİR" // Araba nesnesinin plakasını değiştirdik
    motor1.Durdur("Ahmet") // motor1 değişkeni üzerinden Durdur fonksiyonu çağrıldı
    motor2.Durdur("Mehmet") // motor2 değişkeni üzerinden Durdur fonksiyonu çağrıldı
}

Output

34ABC123 plakalı araba Ahmet tarafından çalıştırıldı
34ABC123 plakalı araba Mehmet tarafından çalıştırıldı
34ABC123 plakalı araba Ahmet tarafından durduruldu
DEĞİŞTİR plakalı araba Mehmet tarafından durduruldu

Görüldüğü üzere motor1 arayüzü araba türümüzü değer türü olarak aldığı için bellekte kopyaladı. Bu nedenle asıl araba türümüzdeki değişiklik bu arayüze yansımadı. Fakat motor2 arayüzü araba türümüzü referans türü olarak aldığı için, yani araba türümüze bellekteki adresinden ulaştığı için, araba türümüzdeki değişiklikler yansıdı.

Arayüz ile Türlerin Güvenli Dönüşümleri

Go dilinde bir arayüzden bir diğeri türüne güvenli bir şekilde dönüşüm yapmak için tip doğrulama veya tip iddiası (type assertion) kullanılabilir. Bu sayede bir arayüz tipinden başka bir tipe dönüşüm yaparken çalışma zamanı hatalarının önüne geçilmiş olur.

Tip Doğrulaması (Type Assertion)

Tip iddiası bir değişkenin belirli bir türe sahip olduğunu doğrulamak için kullanılır. Eğer değişken iddia edilen tipe sahipse dönüşüm başarılı bir şekilde gerçekleşir; aksi takdirde program bir panic hatası üretir.

var motor Motor = Araba{Plaka: "34ABC123"}
if araba, ok := motor.(Araba); ok {
    fmt.Println(araba.Plaka, "bir arabadır.")
} else {
    fmt.Println("Motor bir arabaya dönüştürülemedi.")
}

Tip Değişkeni ile Güvenli Dönüşüm

Go, tip değişkeni (type switch) kullanarak bir değişkenin birden fazla türü kontrol etmeye ve her türe göre farklı işlemler gerçekleştirmeye olanak tanır. Bu, birden fazla tip iddiasını birleştirir ve kodun daha temiz olmasını sağlar.

var motor Motor = getMotor() // getMotor fonksiyonunun herhangi bir Motor türünde nesne döndürdüğünü varsayalım
switch t := motor.(type) {
case Araba:
    fmt.Println(t.Plaka, "bir arabadır")
case Otobus:
    fmt.Println(t.Plaka, "bir otobüstür")
default:
    fmt.Println("Bilinmeyen tür")
}

Sonuç

Arayüzlerin kullanımı, Go'nun tip sisteminin güçlü ve esnek özelliklerinden biridir. Farklı türlerdeki nesneleri tek bir arayüz altında toplayarak kodun genel anlamda daha temiz ve yönetilebilir olmasını sağlar. Tip doğrulaması ve tip değişkenleri ile tür dönüşümleri güvenli ve kontrol altında gerçekleştirilebilir; bu da çalışma zamanı hatalarını minimize eder.

Kaynaklar
PreviousFront-end TeknolojileriNextGo'da Concurrency ve Uygulamaları

Last updated 4 months ago

Was this helpful?

https://go.kaanksc.com/boeluem-3/arayuez-interface
🌐
ResulCelik0 - OverviewGitHub
Bu yazı Resul ÇELİK tarafından hazırlanmıştır.
Logo
Page cover image