Skip to content

Commit

Permalink
Update 1.13-defer-panic-recovery.md
Browse files Browse the repository at this point in the history
تصحیح متن
  • Loading branch information
r3a70 committed May 30, 2023
1 parent 716b430 commit adef6a3
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions content/chapter 1/1.13-defer-panic-recovery.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ $ go run main.go
2
1
```
**دقت داشته باشید که مقداردهی پارامترهای ورودی, برای تابعی که آن را difer کردیم در همان لحظه call شدن آن انجام میشود. به مثال زیر توجه کنید:**
**دقت داشته باشید که مقداردهی پارامترهای ورودی, برای تابعی که آن را defer کردیم در همان لحظه call شدن آن انجام میشود. به مثال زیر توجه کنید:**
```shell
package main

Expand All @@ -100,22 +100,22 @@ First
```
در این مرحله شما باید پی برده باشید که **defer** در همان خطی که نوشته شده است صدا زده میشود, ولی اجرای آن دقیقا به قبل از **return** در تابع موکول میشود.

## 1.13.2 پانیک (panic)
## 1.13.2 پنیک (panic)

در زبان گو panic همانند exception به معنای خروج از برنامه در شرایط غیر عادی می باشد. panic در ۲ حالت زیر پیش می آید:

- خطاهای {{< tooltip text="در زمان اجرا" note="runtime" >}} برنامه
- خطاهای {{< tooltip text="در زمان اجرای" note="runtime" >}} برنامه
- فراخوانی تابع panic توسط برنامه نویس در بخش های مختلف برنامه

```go
func panic(v interface{})
```

از تابع فوق شما می توانید برای ایجاد panic استفاده کنید و به عنوان ورودی دلیل panic را می توانید در قالب خطا یه یک متن مشخص کنید.
شما میتوانید با استفاده از تابع فوق که در توابع `built-in` گولنگ وجود دارد, panic ایجاد کنید و به عنوان ورودی دلیل panic را در قالب یک رشته به تابع ارسال کنید.


{{< hint info >}}
تایپ `{}interface` یک تایپ خیلی کاربردی می باشد برای مواقعی نمی دانیم ورودی یا خروجی تابع یا تایپ متغیر چی میخواهد باشد از اینترفیس استفاده می کنیم.
تایپ `{}interface` یک تایپ بسیار کاربردی است. ما از این تایپ مواقعی استفاده میکنیم که نمیدانیم ورودی تابع چه خواهد بود. به مثال زیر توجه کنید:

```go
package main
Expand All @@ -142,14 +142,14 @@ abcd, string
2.5, float64
```

و به عنوان یک تایپ ضمنی می باشد که در ادامه فصل بعدی بیشتر آشنا خواهیم شد.
همونطور که در مثال بالا دیدید, ما به تایپ `interface` چندین نوع دیتا تایپ رو دادیم و خود کامپایلر زبان گو متوجه نوع اون تایپ ها شد. در فصل بعدی بیشتر با تایپ ها آشنا خواهید شد.
{{< /hint >}}

### 1.13.2.1 خطای panic در زمان اجرا (runtime)

خطاهای panic در زمان اجرا به دلایل زیر می تواند رخ دهد :
- خطای Out of bounds/range array/slice
- فراخوانی تابع که nil pointer باشد
- فراخوانی متغیری که nil pointer باشد `یعنی به هیچ آدرسی از حافظه ` **memory** `اشاره نمیکند`
- ارسال داده برروی کانال های بسته شده
- type assertion نادرست

Expand Down Expand Up @@ -183,10 +183,11 @@ main.main()
exit status 2
```

در تابع فوق ما یک تابع جهت چاپ یک المنت در داخل slice نوشتیم و به عنوان ورودی a و اندیس ۲ را می دهیم در صورتیکه slice ما فقط ۲ تا المنت بیشتر ندارد 0 و 1 ما به اندیس ۲ اشاره کردیم که باعث بروز panic شده است.
در تابع فوق ما یک تابع نوشتیم که به عنوان ورودی یک اسلایس از نوع رشته و یک ایندکس از نوع عدد از ما دریافت میکند و المنت **ایندکسم**‌ اون اسلایس را برای ما چاپ میکند `در مثال بالا اندیس شماره 2. یعنی اندیس شماره 2 از اسلایسی که به عنوان ورودی گرفته است`. این کار ما باعث بروز یک **panic** میشود, فکر میکنید به چه دلیل ؟ بله به این دلیل که اسلایس ما اندیس شماره 2 ندارد. دلیل آن هم این است که اندیس از 0 شروع میشود.

پنیک یک سری اطلاعات در مورد چرایی بوجود امدنش به ما میدهد که در ادامه آنهارو توضیح دادیم:
- پانیک رخ داده شامل متن خطا
- محل رخ دادن panic در قالب stacktrace می باشد
- محل رخ دادن panic در قالب stacktrace


### 1.13.2.2 خطای panic از قبل تعیین شده توسط برنامه نویس
Expand Down

0 comments on commit adef6a3

Please sign in to comment.