Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update 1.13-defer-panic-recovery.md #209

Merged
merged 1 commit into from
May 30, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading