Skip to content

Commit

Permalink
Merge pull request #339 from alireza-fa/main
Browse files Browse the repository at this point in the history
Spelling corrections in chapter1/1.7-function.md
  • Loading branch information
Ja7ad authored Jan 22, 2024
2 parents d41e6d3 + e351431 commit bdd13fa
Showing 1 changed file with 86 additions and 3 deletions.
89 changes: 86 additions & 3 deletions content/chapter 1/1.7-function.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ $ go run func.go
3. برای صدا زدن توابع کافی است نام تابع رو همراه با پرانتز باز و بسته تایپ کنید, برای مثال ()plus.

{{< hint info >}}
در صورتی که نوع پارامترهای ورودی از یک نوع باشند بجای تعریف تک تک نوع داده‌ها می‌توانیم نوع داده را در آخر همه پارامترهای هم نوع مشخص کنیم.
در صورتی که پارامترهای ورودی از یک نوع باشند بجای تعریف نوع به‌صورت تکی، می‌توانیم نوع داده را در آخر همه پارامترهای هم نوع مشخص کنیم.
```go
func plus(a, b int)
// or
Expand Down Expand Up @@ -160,7 +160,7 @@ $ go run main.go
```

1. ما در این تابع مقدار بازگشتی را x, y از نوع int نام گذاری می‌کنیم.
2. در اینجا یک دستور return بدون تعیین آرگومان بازگشتی، مقادیر نام گذاری شده را باز می‌گرداند، که به عنوان **Naked return** شناخته می‌شود.
2. در اینجا یک دستور return بدون تعیین آرگومان بازگشتی، مقادیر نام گذاری شده را باز می‌گرداند، که به عنوان **Naked return** شناخته می‌شود.
3. از naked return باید در توابع کوتاه مانند مثال بالا استفاده شود. استفاده آن در تابع طولانی منجر به کاهش خوانایی کد می شود.


Expand Down Expand Up @@ -276,8 +276,91 @@ Sum by adding 10 is: 28

## 1.7.7 توابع از پیش تعریف شده (Built-in Function)

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


https://book.gofarsi.ir/chapter-1/go-builtins/

<br/>

## 1.7.7 کلوژر(Function closure)

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

```go
package main
import "fmt"
func main() {
number := 1
func() {
fmt.Println(number * 2)
}()
}
```

در مثال بالا ما یک anonymous function داریم که درون خودش از متغیر اسکوپی که خارج از خودش قرار دارد استفاده کرده است. به این عمل کلوژر می گوییم.

زمانی که از کلوژر ها استفاده می کنید. برخی مواقع بهتر است به‌جای اینکه به‌صورت مستقیم به متغیر اسکوپ خارجی دسترسی داشته باشید، در پارامتر های ورودی مقدار را دریافت کنید. به مثال زیر دقت کنید(در این مثال از concurrency استفاده کردیم. اگر آشنایی ندارید با مطالعه مقدمه ای از فصل سوم مثال را متوجه می شوید)

```go
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 10; i++ {
go func() {
fmt.Println(i)
}()
}
time.Sleep(time.Second * 1)
}
```

خروجی کد برخلاف چیزی که تصور می کنیم به این شکل است:

```shell
$ go run main.go
10
10
10
10
10
10
10
10
10
10
```

این اتفاق به این دلیل می افتد چون کلوژر ها به‌صورت مستقیم به مقدار اسکوپ بالایی خود دسترسی دارند. قبل از اینکه گوروتین ها مقدار را چاپ کنند حلقه به انتها می رسد و مقدار i برابر با 10 می شود. برای همین در خروجی همه گوروتین ها مقدار 10 چاپ می شود.
برای حل این مشکل مقدار i را در پارامتر فانکشن دریافت می کنیم:

```go
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 10; i++ {
go func(num int) {
fmt.Println(num)
}(i)
}
time.Sleep(time.Second * 1)
}
```

پس زمانی که از کلوژر ها استفاده می کنید به این نکات دقت کنید.

0 comments on commit bdd13fa

Please sign in to comment.