Go dili ve pointerlar

Selamlar. Yakın zamanda Go çalışmaya başladım ve aklıma bir soru takıldı. Şu an struct mantığını anlamaya çalışıyorum,

package main

import "fmt"

type dog struct {
	race string
	age  int
}

func newDog(race string, age int) *dog {
	d := dog{race: race, age: age}
	return &d
}

func main() {
	animal := newDog("golden", 5)
	fmt.Println(animal)
}

Buradaki tutorial’da anlamadığım konu newDog fonksiyonu &d döndürüyor, yani d değişkeninin hafızadaki yeri döndürülüyor fakat fonksiyonu tanımlarken func newDog(race string, age int) *dog { bu kısımda *dog döndüreceği söylenmiş yani verinin adresi değil değerinin döndürüleceği söyleniyor (sanırım pass by reference, pass by value durumuyla doğrudan alakalı).
Açıklamada böyle bir yol izlenmesinin idiomatic olduğu söyleniyor. Böyle bir idiom neden var acaba?
neden direkt

func newDog(race string, age int) dog {
	d := dog{race: race, age: age}
	return d
}

şeklinde yapmıyoruz bu işlemi?

Bundan emin misiniz? dog’a pointer/referans dondurecegini soyluyor gibi. return &d de bunu destekliyor.

Hangi aciklama? Bulamadim.

Go semantiklerini bilmiyorum ama pointer/referans turleri varsa geriye kalanlar saga sola kopyalaniyor (i.e. deger semantigine sahip) olabilir. Gereksiz kopyalardan kacinmak ve Java/C# davranisina yaklasmak icin x yerine *x kullanmak idiomatik olabilir.

Hocam linki yanlış koymuşum kusura bakmayın şimdi editledim. Pointer mantığını tam anlamamışım sanırım. Bu konuya bir bakmam gerekecek tekrar.
Örneğin

myVar := 5
p := &myVar

burada p değişkeni, myVar değişkeninin pointer’ı olmuyor mu? Burada bir hatam mı var acaba?

Ben de dogru haline bakiyordum zaten.

Struct yaratimi constructor fonksiyon yardimiyla yapilir diyor, fmt.Println(person { name: "Jon" }) gibi inline yapmak yerine.

Evet, turu de *myVarinTuru oluyor su 2-3 sayfadan anladigim kadariyla.

Şöyle sanırım daha iyi anladım. & operatörü sadece değerin adresini belirtiyor. Go dilinde type inference olduğundan Python’a benzer şekilde := operatörleriyle değişkeni tip yazmadan direkt tanımlayabiliyoruz.
Ancak şu şekilde daha iyi anladım.

var x int = 42
var ptrX *int = &x

bu şekilde, kodu Türkçe’ye çevirirsem,

  1. satır:

  2. satır:

Pointer’lara biraz yabancı olduğum için çocuğa anlatır gibi anlamaya çalışıyorum kendi kendime. Bu şekilde doğru sanırım değil mi?

Evet. Go bilmiyorum ama anlattigin sey tutarli.

var yerine tipi yazip pointer yildizini saga koyarsan C, C++ ve C# oluyor bu arada.

1 Beğeni

Yakın zamanda konuşulan bir konuyla da alakalı olduğunu düşünüyorum. Go’da pointer aritmetiği var mı bilmiyorum. Ama ona benzer bir şeyler vardır diye tahmin ediyorum. Belki faydası olur.

Mesela aşağıdaki kodu inceleyin isterseniz. Aslında class benzeri bir şey oluşturuyoruz.

#include <stdio.h>

struct Dog {
    char * name;
    void (*talk)(char *);
};

struct Dog __init__(char * name, void (*talk)(char *)) {
    struct Dog dog;
    dog.name = name;
    dog.talk = talk;
    return dog;
}

void function(char * something) {
    printf("%s\n", something);
}

int main() {
    char * name = "hello";
    struct Dog myDog = __init__(name, function);
    myDog.talk("hello");
    return 0;
}
1 Beğeni

Sunun gibi mi? :slight_smile:

Sì, anche così. :smiley: