تصور کن داری با کاغذ و آدرس خونه کار میکنی:
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("سلام") // خروجی: سلام
}

