Menu
Coddy logo textTech

Go'da İşaretçi Temelleri

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 19 / 107.

İşaretçi, başka bir değişkenin bellek adresini depolayan bir değişkendir. Doğrudan bir değer tutmak yerine, bu değerin bellekte bulunduğu konumu tutar. İşaretçiler Go için temeldir ve verileri verimli bir şekilde işlemek için gereklidir.

Bir işaretçi oluşturmak için bir değişkenin adresini almak üzere & operatörünü, bir işaretçi türü bildirmek veya o adresteki değere erişmek için ise * operatörünü kullanın.

x := 42
p := &x  // p, x'in bellek adresini tutar

fmt.Println(p)  // 0xc000018030 (bellek adresi)
fmt.Println(*p) // 42 (o adresteki değer)

& operatörü “adresi” anlamına gelir ve bir işaretçi döndürür. Bir işaretçi üzerinde kullanıldığında * operatörü “değeri” anlamına gelir ve buna başvuruyu kaldırma denir. İşaretçi aracılığıyla özgün değeri de değiştirebilirsin.

x := 10
p := &x

*p = 25         // işaretçi aracılığıyla değeri değiştir
fmt.Println(x)  // 25 (orijinal değişken değişti)

İşaretçi türü, T işaret edilen tür olmak üzere *T şeklinde yazılır. Bir int işaretçisi *int türündedir.

var p *int      // int için bir işaretçi bildirir
x := 100
p = &x          // p artık x'e işaret ediyor

Bir işaretçinin sıfır değeri nil’dir; bu, hiçbir şeyi göstermediği anlamına gelir. Nil bir işaretçinin başvurusunu kaldırmaya çalışmak çalışma zamanında paniğe neden olur; bu nedenle işaretçileri kullanmadan önce her zaman başlatıldıklarından emin ol.

challenge icon

Görev

Kolay

Değişkenleri bellek adresleri üzerinden değiştirmek için işaretçilerin gücünü gösteren basit bir değer değiştirici oluşturalım.

Kodunu iki dosyaya ayıracaksın:

  • swap.go: Parametre olarak iki SwapValues işaretçisi alan *int adlı bir fonksiyon oluştur. Bu fonksiyon, işaretçilerin gösterdiği değerleri değiştirmelidir; fonksiyon çağrıldıktan sonra her değişken diğerinin ilk değerini taşımalıdır. Fonksiyon herhangi bir şey döndürmez; değerleri doğrudan işaretçiler üzerinden değiştirir.
  • main.go: Girdiden iki tam sayı oku, bunları değişkenlerde sakla, ardından değerlerini değiştirmek için SwapValues fonksiyonunu kullan. Değişimi göstermek için her iki değeri de değişimden önce ve sonra yazdır.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Birinci tam sayı
  • 2. satır: İkinci tam sayı

Çıktı biçimi:

Before: a=[first] b=[second]
After: a=[first] b=[second]

Örneğin, 10 ve 25 verildiğinde çıktın şu şekilde olmalıdır:

Before: a=10 b=25
After: a=25 b=10

Değişkenlerini fonksiyona aktarırken & operatörünü, gerçek değerlere erişmek ve onları değiştirmek için fonksiyonun içinde * operatörünü kullanmayı unutma.

Kendin dene

package main

import "fmt"

func main() {
	// Girişten iki tamsayı oku
	var a, b int
	fmt.Scanln(&a)
	fmt.Scanln(&b)

	// Takastan önce değerleri yazdır
	fmt.Printf("Before: a=%d b=%d\n", a, b)

	// TODO: a ve b'ye işaretçilerle SwapValues fonksiyonunu çağır
	// Adresleri geçmek için & operatörünü kullanmayı unutma

	// Takastan sonra değerleri yazdır
	fmt.Printf("After: a=%d b=%d\n", a, b)
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi