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
}
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.
Şö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.
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;
}