Skip to content

Commit

Permalink
Merge pull request #350 from ar-mokhtari/main
Browse files Browse the repository at this point in the history
edit: map / remove some inappropriate changes from last PR(s)
  • Loading branch information
Ja7ad authored Apr 3, 2024
2 parents 36bce0d + 1024a62 commit ae0b008
Showing 1 changed file with 39 additions and 34 deletions.
73 changes: 39 additions & 34 deletions content/chapter 1/1.10-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ map[KeyType]ValueType
````
کلمه کلیدی `map` و بعد نوع کلید و در آخر هم نوع مقدار تعریف می‌شود.
- کلید: برای اشاره به یک مقدار ذخیره شده، نیاز به یک نام‌ داریم و این یعنی «کلید» آن مقدار.
- مقدار کلید در یک مپ، باید {{< tooltip text="یکتا" note="unique" >}} باشد.
- محدودیت: برای تعریف کلید، از انواع تایپ‌هایی که {{< tooltip text="قابل مقایسه" note="comparable " >}} هستند، می‌توان استفاده کرد:
- Boolean(s)
- Number(s)
Expand Down Expand Up @@ -56,7 +57,7 @@ map[string]map[int]string

## 1.10.3 ایجاد و مقداردهی اولیه

مقدار پیش‌فرض برای یک مپ nil است. برای مقداردهی مپ‌ ها از روش‌های زیر استفاده می‌شود:
مقدار پیش‌فرض برای یک مپ nil می‌باشد. برای مقداردهی مپ‌ ها از روش‌های زیر استفاده می‌شود:
- استفاده از کلمه کلیدی var
```go
var sampleMap = map[keyType]valueType{keyName1:value1, keyName2:value2, ...}
Expand Down Expand Up @@ -229,42 +230,44 @@ func delete(m map[Type]Type1, key Type)

## 1.10.7 بررسی وجود کلید

به کد زیر توجه کنید:
```go
package main
import "fmt"
func main() {
x := make(map[string]int)
a := x["num"]
fmt.Println(a) // 0
x["num"] = 0
b := x["num"]
fmt.Println(b) // 0
}
```
در حالت اول کلید 'num' وجود نداشت و مقدار 0 چاپ شد. در حالت دوم مقدار 0 به کلید 'num' نسبت داده شده و همان مقدار 0 چاپ شد. حال ممکن است موقعیتی پیش بیاید که لازم باشد بدانیم که آیا یک کلید وجود دارد یا نه. در این صورت به جای یک متغیر، از دو متغیر برای جستجو در مپ استفاده می‌کنیم:

یکی از خدماتی که مپ ارائه می‌دهد،‌ پاسخ به سوال وجود یک کلید خاص در مپ می‌باشد که به‌عنوان راهکاری برای حل مسائل از آن استفاده می‌شود. مثال زیر را ببینید:

```go
package main
import "fmt"
func main() {
x := make(map[string]int)
a, ok := x["num"]
fmt.Println(a, ok) // 0 false
x["num"] = 0
b, ok := x["num"]
fmt.Println(b, ok) // 0 true
package main
import "fmt"
func main() {
var personData = map[string]string{"name": "frank", "family": "colleti", "dob": "1970-05-12"}
name, nameExist := personData["name"]
family, familyExist := personData["family"]
dob, dobExist := personData["dob"]
organization, organizationExist := personData["organization"]
fmt.Println(name, nameExist)
//frank true
fmt.Println(family, familyExist)
//colleti true
fmt.Println(dob, dobExist)
//1970-05-12 true
fmt.Println(organization, organizationExist)
// false
}
```

- این روش بیشتر به اسم `comma, ok` شناخته می‌شود و بسیاری از توابع چه در کتابخانه استاندارد و چه کتابخانه‌های عمومی در گولنگ، از این نوع نام‌گذاری برای برگشت دادن مقدار و ارور پشتیبانی می‌کنند.
- در مثال بالا تمامی متغیرهایی که با `Exist` تمام می‌شوند برای برسی وجود و عدم وجود یک کلید در `مپ` استفاده می‌شوند، به این صورت که اگر مقدار مشخص شده در `مپ` وجود داشت مقدار برگشتی در این متغیرها `true` خواهد بود و در غیر این صورت مقدار برگشتی `false`.

{{< playground url=55Ga1f_c8Fz >}}

## 1.10.8 مپ، یک جدول، یک منبع

وقتی یک مپ تعریف می‌شود، اگر مپ(های) دیگری از روی آن ساخته شود، دارای یک منبع `(بهش میگن reference type)` برای ذخیره و دریافت اطلاعات خواهند بود. در مثال زیر، مپ `editorMap` از مپ `companyProfile` ایجاد و وقتی ویرایش می‌شود، مپ اصلی **نیز**،‌ ویرایش می‌شود.
وقتی یک مپ تعریف می‌شود، اگر مپ(های) دیگری از روی آن ساخته شود، دارای یک منبع `(reference type)` برای ذخیره و دریافت اطلاعات خواهند بود. در مثال زیر، مپ `editorMap` از مپ `companyProfile` ایجاد و وقتی ویرایش می‌شود، مپ اصلی **نیز**،‌ ویرایش می‌شود.
```go
package main
Expand Down Expand Up @@ -329,8 +332,9 @@ func main() {

## 1.10.9 پیمایش روی مپ

یکی از اصلی‌ترین اهداف ایجاد و نگهداری انواع تایپ‌های مربوط به مجموعه داده‌ها `... map and `، امکان دسترسی به اجزای آن‌ها با استفاده از لوپ‌ها `در گولنگ فقط for-loop` است.
با استفاده از for-range می‌توان به اجزای یک داده‌ از نوع کلید-مقدار دسترسی داشت. به مثال زیر توجه کنید:
یکی از اصلی‌ترین اهداف ایجاد و نگهداری انواع تایپ‌های مربوط به مجموعه داده‌ها، امکان دسترسی به اجزای داده و انواع لوپ از ابزارهای آن است.
با استفاده از for-range می‌توان به اجزای یک داده‌ از نوع کلید-مقدار دسترسی داشت

```go
package main
Expand Down Expand Up @@ -421,7 +425,8 @@ func main() {

## 1.10.11 خودآزمون

کد زیر را بررسی کنید و خروجی(های) آن را با در ذهن محاسبه کنید. سپس صحت آن(ها) را بررسی و درباره آن تحقیق کنید:
کد زیر را بررسی کنید و خروجی(های) آن را با ذهن خود پردازش کنید. سپس صحت آن(ها) را بررسی و درباره آن تحقیق کنید:

```go
package main
Expand Down

0 comments on commit ae0b008

Please sign in to comment.