4.23.1 کپسوله سازی (Encapsulation)

4.23.1 کپسوله سازی (Encapsulation)

کپسوله سازی در زبان گو یا هر زبان دیگری یک مفهوم مشترک می باشد که شما یک داده یک تابع را پشت یک آبجکت یا یک واحد مستقل بپوشانید. با اینکار شما جلوی دسترسی مستقیم برروی داده را میگیرید. این کار در شی گرایی کمک می کند شما کدهای خود را بهتر سازماندهی کنید و جلوی دسترسی مستقیم ناخواسته را بگیرید.

در زبان گو برای Public/Private کردن یک آبجکت یا تابع کلمه کلیدی به نام public/private ندارد ولی در عوض شما می توانید داخل هر پکیج با بزرگ یا کوچک کردن حرف اول نام هر آبجکت یا تابع جلو دسترسی مستقیم را بگیرید.

1var DatabaseName string // public
2var databaseName string // private
3
4func Greeting() {} // public
5func greeting() {} // private

زمانی که شما یک آبجکت یا تابع را به شیوه فوق private می کنید در واقع آن آبجکت یا تابع فقط در همان package level خود در دسترس می باشد.

به عنوان مثال اگر تابع greeting داخل پکیج message باشد فقط در همان جا در دسترس می باشد.

1└── message
2    ├── data.go
3    ├── message.go
4    └── resp.go

در زیر یک مثال ساده زدیم توجه کنید :

 1package main
 2
 3import "fmt"
 4
 5type Person struct {
 6	name string
 7	age  int
 8}
 9
10func (p *Person) GetAge() int {
11	return p.age
12}
13
14func (p *Person) getName() string {
15	return p.name
16}
17
18func (p *Person) SetAge(age int) {
19	p.age = age
20}
21
22func main() {
23	person := Person{
24		name: "Javad",
25	}
26
27	person.SetAge(29)
28
29	fmt.Printf("%s with age %d", person.getName(), person.GetAge())
30}
1$ go run main.go
2Javad with age 29

کد فوق ما یک ساختار (آبجکت) Person ایجاد کردیم که داخلش ۲ فیلد name, age بصورت private وجود دارد که سایر پکیج ها نمی توانند دسترسی مستقیم به فیلد های Person دسترسی داشته باشند. حال ۳ متد تعریف کردیم GetAge برای گرفتن سن شخص , SetAge برای تعیین سن شخص , getName گرفتن نام شخص که فقط داخل همان پکیج در دسترس است این متد.