تصور کن داری با کاغذ و آدرس خونه کار می‌کنی:

  •  Value Type مثل اینه که یه کپی از یه کاغذ به دوستت بدی. هرچی روش بنویسه، کاغذ تو دست خودت تغییری نمی‌کنه.

  •  Reference Type مثل اینه که آدرس خونه‌تو بدی، و اون بیاد مستقیم وسایلت رو دستکاری کنه! هر تغییری بده، تو هم می‌بینی چون مال خودته.

Value Type = «کپی گرفتن از مقدار»

وقتی یه مقدار از این نوعو می‌فرستی یه جا، فقط یه نسخه ازش می‌ره، نه اصلش!

مثال عدد:

func change(x int) {
x = 50
}

func main() {
a := 10
change(a)
fmt.Println(a) // خروجی: 10 → تغییر نکرد!
}

مثال Struct (ساختار داده‌ای)

type Person struct {
name string
age int
}

func growUp(p Person) {
p.age += 10
}

func main() {
me := Person{name: "Ali", age: 20}
growUp(me)
fmt.Println(me.age) // خروجی: 20 → چون struct هم کپی میشه!
}

Reference Type = «فرستادن آدرس حافظه»

یعنی می‌فرستی طرف مستقیم با نسخه اصلی کار کنه! مثل آدرس خونه‌ت.

مثال با Pointer:

func change(x *int) {
*x = 50
}

func main() {
a := 10
change(&a)
fmt.Println(a) // خروجی: 50 → تغییر کرد چون آدرسشو دادیم
}

انواع Reference Type با مثال

1. Slice (برش آرایه)

مثل لیستی از اعداد، که می‌ره با اصلش کار می‌کنه:

func changeFirst(s []int) {
s[0] = 100
}

func main() {
n := []int{1, 2, 3}
changeFirst(n)
fmt.Println(n) // خروجی: [100 2 3]
}

2. Map (نگاشت)

مثل یه فرهنگ لغت که مستقیم روش تغییر ایجاد می‌کنی:

func changeMap(m map[string]int) {
m["age"] = 30
}

func main() {
info := map[string]int{"age": 20}
changeMap(info)
fmt.Println(info["age"]) // خروجی: 30
}

 

3. Channel (کانال ارتباطی)

برای ارتباط گوروتین‌ها. هرکی بهش دسترسی داره، واقعاً دسترسی داره!

func sendData(ch chan int) {
ch <- 42
}

func main() {
ch := make(chan int)
go sendData(ch)
fmt.Println(<-ch) // خروجی: 42
}

 

4. Function (تابع هم متغیره!)

تابع‌ها هم می‌تونی بذاری تو یه متغیر و بفرستی این‌ور و اون‌ور:

func greet() {
fmt.Println("Hello!")
}

func callMe(f func()) {
f()
}

func main() {
callMe(greet) // خروجی: Hello!
}

 

5. Interface

نوع کلی که می‌تونه هر چی باشه. چون مقدارش به صورت ارجاعی نگه داشته میشه، خودش Reference Type حساب میشه.

func printAny(v interface{}) {
fmt.Println(v)
}

func main() {
printAny("سلام") // خروجی: سلام
}