Skip to content

Commit

Permalink
Merge pull request #272 from mezz-ir/main
Browse files Browse the repository at this point in the history
Update typography and spacing corrections in 1.1-basic-structure
  • Loading branch information
Ja7ad authored Aug 13, 2023
2 parents 4ebb466 + b10073d commit 8c194c7
Showing 1 changed file with 19 additions and 19 deletions.
38 changes: 19 additions & 19 deletions content/chapter 1/1.1-basic-structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,29 @@ slug: structure-of-go-code
weight: 1001
---

همانطور که در تاریخچه زبان گو گفتیم, زبان گو سینتکس خیلی تمیز و ساده ای دارد که به راحتی می توانید کدهای زبان گو را بخوانید. در ادامه ما سعی می کنیم با مثال های ساده شما را با ساختار کد زبان گو آشنا کنیم.
همانطور که در تاریخچه زبان گو گفتیم, زبان گو سینتکس خیلی تمیز و سادهای دارد که به راحتی میتوانید کدهای زبان گو را بخوانید. در ادامه ما سعی میکنیم با مثالهای ساده شما را با ساختار کد زبان گو آشنا کنیم.

{{< hint info >}}
**به نقل از تاریخچه**
سینتکس زبان گو به گونه ای طراحی شده که خیلی ساده و تمیز می باشد و این باعث می شود خیلی سریع زبان گو را یاد بگیرید و از همه مهم تر توسعه پروژه های {{< tooltip text="مقیاس پذیر" note="Scale up" >}} با زبان گو به دلیل سادگی و آشکار بودن مفاهیم خیلی سریعتر صورت میگیرد.
سینتکس زبان گو به گونهای طراحی شده که خیلی ساده و تمیز است و این باعث میشود خیلی سریع زبان گو را یاد بگیرید و از همه مهمتر توسعه پروژههای {{< tooltip text="مقیاس پذیر" note="Scale up" >}} با زبان گو به دلیل سادگی و آشکار بودن مفاهیم خیلی سریع‌تر صورت‌ گیرد.
{{< /hint >}}


## 1.1.0 زبان برنامه نویسی
## 1.1.0 زبان برنامهنویسی

یک زبان برنامه‌نویسی یک زبان مصنوعی انگلیسی است که برای بیان محاسباتی که توسط یک ماشین (مخصوصاً رایانه) قابل انجام است، طراحی شده‌است. زبان‌های برنامه‌نویسی برای ایجاد برنامه‌هایی به کار می‌روند که رفتار یک ماشین را مشخص می‌کنند، الگوریتم دقیق را بیان می‌کنند، یا روشی برای تعامل انسان و رایانه هستند. بسیاری از زبان‌های برنامه‌نویسی تعدادی قالب از ویژگی‌های نوشته شده دستوری یا نحو (syntax) و معناشناسی (semantics) دارند، چرا که رایانه‌ها دستورهای دقیقاً مشخص نیاز دارند. برخی توسط سند خصوصیات (specification document) تعیین شده‌اند (برای مثال یک استاندارد ISO)، در حالی که برخی دیگر دارای پیاده‌سازی غالبی می‌باشند[[به نقل از ویکی پدیا](https://fa.wikipedia.org/wiki/%D8%B2%D8%A8%D8%A7%D9%86_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C)].
یک زبان برنامه‌نویسی یک زبان مصنوعی انگلیسی است که برای بیان محاسباتی که توسط یک ماشین (مخصوصاً رایانه) قابل انجام است، طراحی شده‌ است. زبان‌های برنامه‌نویسی برای ایجاد برنامه‌هایی به کار می‌روند که رفتار یک ماشین را مشخص می‌کنند، الگوریتم دقیق را بیان می‌کنند، یا روشی برای تعامل انسان و رایانه هستند. بسیاری از زبان‌های برنامه‌نویسی تعدادی قالب از ویژگی‌های نوشته شده دستوری یا نحو (syntax) و معناشناسی (semantics) دارند، چرا که رایانه‌ها دستورهای دقیقاً مشخص نیاز دارند. برخی توسط سند خصوصیات (specification document) تعیین شده‌اند (برای مثال یک استاندارد ISO)، در حالی که برخی دیگر دارای پیاده‌سازی غالبی می‌باشند[[به نقل از ویکی پدیا](https://fa.wikipedia.org/wiki/%D8%B2%D8%A8%D8%A7%D9%86_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C)].

## 1.1.1 پکیج
هر برنامه‌ای که با ساختار گو ایجاد شده باشد، از پکیج(ها) ساخته شده است. درواقع زبان گو یک زبان {{< tooltip text="بر پایه پکیج" note="package-base" >}} است.
برخلاف برخی دیگر که {{< tooltip text="بر پایه فایل" note="file-base" >}} هستند.
این به‌این‌معنی است که به «مجموعه»ای از ابزارها اعم از ثابت‌ها، متغیرها و عملیات مختلف که زیرمجموعه یک نام تعریف می‌شوند، پکیج می‌گوئیم. تفاوتی ندارد در یک «فایل» یا «چند» فایل، بشرطی که ابتدای همگی package name باشد.
این به‌ این‌ معنی است که به «مجموعه»ای از ابزارها اعم از ثابت‌ها، متغیرها و عملیات مختلف که زیرمجموعه یک نام تعریف می‌شوند، پکیج می‌گوئیم. تفاوتی ندارد در یک «فایل» یا «چند» فایل، بشرطی که ابتدای همگی package name باشند.

## 1.1.2 یک نمونه کد ساده زبان گو

قبل از اینکه محتوای بدنه کد زیر را بررسی کنیم؛ بهتر است با نحوه کامنت گذاری کد در زبان گو آشنا شوید.
قبل از اینکه محتوای بدنه کد زیر را بررسی کنیم؛ بهتر است با نحوه کامنتگذاری کد در زبان گو آشنا شوید.

### 1.1.2.1 کامنت گذاری
کامنت ها در زبان گو همانند زبان سی می باشد که با قرار دادن ۲ {{< tooltip text="اسلش" note="Slash" >}} در ابتدای خط یا قرار دادن یک یا چند خط ما بین /\* و \*/ ایجاد میشود.
کامنتها در زبان گو همانند زبان سی میباشد که با قرار دادن ۲ {{< tooltip text="اسلش" note="Slash" >}} در ابتدای خط یا قرار دادن یک یا چند خط ما بین /\* و \*/ ایجاد می‌شود.

```go
// کامنت عادی یک خطی
Expand All @@ -38,7 +38,7 @@ weight: 1001

### 1.1.2.2 نمونه کد

در پایین یک نمونه کد قرار دادیم که با کامنت هر کدام از بخش های بدنه کد گو را توضیح دادیم
در پایین یک نمونه کد قرار دادیم که با کامنت هر کدام از بخشهای بدنه کد گو را توضیح دادیم.

```go
package main // نام پکیج فایل سورس را مشخص می کند
Expand Down Expand Up @@ -70,7 +70,7 @@ func main() {
```
{{< playground url=jjTmLnKmEy5 >}}

سورس کد بالا را در فایلی با نام `basic-code-element-demo.go` ذخیره می کنیم و سپس با دستور زیر اجرا می کنیم تا خروجی کد فوق را ببینیم :
سورس کد بالا را در فایلی با نام `basic-code-element-demo.go` ذخیره میکنیم و سپس با دستور زیر اجرا میکنیم تا خروجی کد فوق را ببینیم :

```shell
$ go run basic-code-element-demo.go
Expand All @@ -79,7 +79,7 @@ Result: 46 + 54 = 100? true

## 1.1.3 تابع main

در زبان گو پکیج main به عنوان یک پکیج منحصربه فرد در نظر گرفته می‌شود، به شکلی که در هنگام اجرای برنامه مشخص میکند شروع کار و خواندن برنامه از کجا باید باشد. در نهایت داخل این پکیج ما تابع ()main را داریم که این تابع نقطه شروع اجرای برنامه ما خواهد بود. این تابع هیچ ارگومانی نمیگیرد و هیچ چیزی رو هم {{< tooltip text="بازگشت" note="return" >}} نخواهد داد. زبان گو به صورت خودکار تابع ()main را فراخوانی می‌کند. برای همین نیازی به فراخوانی این تابع توسط شما وجود ندارد. برای همین باید دقت داشته باشید در هر برنامه ای که می‌نویسید حتما از پکیج و تابع main باید استفاده کنید.
در زبان گو پکیج main به عنوان یک پکیج منحصر به فرد در نظر گرفته می‌شود، به شکلی که در هنگام اجرای برنامه مشخص می‌کند شروع کار و خواندن برنامه از کجا باید باشد. در نهایت داخل این پکیج ما تابع ()main را داریم که این تابع نقطه شروع اجرای برنامه ما خواهد بود. این تابع هیچ ارگومانی نمی‌گیرد و هیچ چیزی رو هم {{< tooltip text="بازگشت" note="return" >}} نخواهد داد. زبان گو به صورت خودکار تابع ()main را فراخوانی می‌کند. برای همین نیازی به فراخوانی این تابع توسط شما وجود ندارد. برای همین باید دقت داشته باشید در هر برنامهای که می‌نویسید حتما از پکیج و تابع main باید استفاده کنید.

```go
// تعریف پکیج main
Expand All @@ -102,15 +102,15 @@ Result: Hello GoFarsi!
```


دستور بالا ابتدا داخل پوشه temp سیستم شما یک فایل اجرایی را درست میکند و سپس آن فایل را اجرا میکند و در نهایت خروجی را به ما نشان میدهد. اگر شما بخواهید خروجی فایل اجرایی (executable) داشته باشید و سپس آن را اجرا کنید می‌توانید از دستور زیر استفاده کنید:
دستور بالا ابتدا داخل پوشه temp سیستم شما یک فایل اجرایی را درست می‌کند و سپس آن فایل را اجرا می‌کند و در نهایت خروجی را به ما نشان می‌دهد. اگر شما بخواهید خروجی فایل اجرایی (executable) داشته باشید و سپس آن را اجرا کنید می‌توانید از دستور زیر استفاده کنید:

```shell
$ go build main.go
$ ./main
Result: Hello GoFarsi!
```

اگر بخواهید برای خروجی فایل اجرایی اسمی در نظر بگیرید میتوانید از دستور زیر با پارامتر o- استفاده کنید.
اگر بخواهید برای خروجی فایل اجرایی اسمی در نظر بگیرید می‌توانید از دستور زیر با پارامتر o- استفاده کنید.

```shell
$ go build -o goFarsi main.go
Expand All @@ -119,7 +119,7 @@ Result: Hello GoFarsi!
```

{{< hint info >}}
دقت کنید اگر از سیستم عامل ویندوز استفاده میکنید بعد از وارد کردن اسم، پسوند `.exe` را نیز اضافه کنید.
دقت کنید اگر از سیستمعامل ویندوز استفاده می‌کنید بعد از وارد کردن اسم، پسوند `.exe` را نیز اضافه کنید.
{{< /hint >}}

{{< hint info >}}
Expand All @@ -128,7 +128,7 @@ Result: Hello GoFarsi!

## 1.1.5 بررسی syntax

برخلاف بیشتر زبان‌های برنامه نویسی در زبان گو شما نمی‌توانید از حالت های مختلف برای نوشتن کد خود استفاده کنید. مثلا کد زیر هنگام کامپایل کردن خطا میدهد.
برخلاف بیشتر زبان‌های برنامه نویسی در زبان گو شما نمی‌توانید از حالتهای مختلف برای نوشتن کد خود استفاده کنید. مثلاً کد زیر هنگام کامپایل کردن خطا می‌دهد.

```go
package main
Expand All @@ -148,19 +148,19 @@ Result:
.\main.go:4:1: syntax error: unexpected semicolon or newline before {
```
صرفا با تغییر براکت ما با خطا مواجه شدیم. شاید از دید شما این نوع نوشتن کد نباید خطا ایجاد کند. ولی وقتی شما داخل یک تیم هستید و مجبور هستید کدها را بازخوانی کنید تا بفهمید چه اتفاقی افتاده است، با حالتهای مختلف سینتکس مواجه نخواهید شد، و همه کدها یک دست و از یک ساختار پیروی می‌کند. که باعث خواندن سریع تر، درک بهتر و امکان توسعه سریعتر را برای ما و هم تیمی های ما ایجاد خواهد کرد.
صرفا با تغییر براکت ما با خطا مواجه شدیم. شاید از دید شما این نوع نوشتن کد نباید خطا ایجاد کند. ولی وقتی شما داخل یک تیم هستید و مجبور هستید کدها را بازخوانی کنید تا بفهمید چه اتفاقی افتاده است، با حالت‌های مختلف سینتکس مواجه نخواهید شد، و همه کدها یک دست و از یک ساختار پیروی می‌کنند، که باعث خواندن سریعتر، درک بهتر و امکان توسعه سریع‌تر را برای ما و همتیمیهای ما ایجاد خواهد کرد.
### 1.1.5.1 استفاده از go fmt
برای آنکه از این نوع خطاها جلوگیری شود و فرمت مناسب و یک نواختی داخل کدهای ما وجود داشته باشد، خود IDEها این خطاها را بهمون نشون میدن. خود توسعه دهندگان زبان گو پارامتر fmt یا به عبارتی فرمت را در اختیار ما قرار داده اند تا هر زمان که کدی مینویسم و ذخیره میکنیم بتوانیم با استفاده از این دستور ساختار کد خود را مرتب کنید و اگر خطایی وجود داشته باشد قبل از کامپایل کردن برنامه آن را پیدا و رفع کنیم. مثلا خروجی استفاده از پارامتر fmt
برای آن که از این نوع خطاها جلوگیری شود و فرمت مناسب و یک نواختی داخل کدهای ما وجود داشته باشد، خود IDEها این خطاها را به ما نشان می‌دهد. خود توسعهدهندگان زبان گو پارامتر fmt یا به عبارتی فرمت را در اختیار ما قرار دادهاند تا هر زمان که کدی می‌نویسم و ذخیره می‌کنیم بتوانیم با استفاده از این دستور ساختار کد خود را مرتب کنیم و اگر خطایی وجود داشته باشد قبل از کامپایل کردن برنامه آن را پیدا و رفع کنیم. مثلاً خروجی استفاده از پارامتر fmt
```shell
$ go fmt main.go
Result:
.\main.go:4:1: unexpected semicolon or newline before {
```
حالا فرض کنید کدی را نوشته اید و داخل کد شما فضای زیادی وجود دارد و اندازه tab ها و space ها مشخص نیست. به مثال زیر توجه کنید:
حالا فرض کنید کدی را نوشتهاید و داخل کد شما فضای زیادی وجود دارد و اندازه tabها و spaceها مشخص نیست. به مثال زیر توجه کنید:
```go
package main
Expand All @@ -181,7 +181,7 @@ println("print line 2")
```
{{< playground url=BKsgOMX6v3K >}}
وقتی کدی شبیه کد بالا را دارید و از دستور go fmt استفاده میکنیم خروجی کد بالا به شکل زیر تغییر پیدا می‌کند:
وقتی کدی شبیه کد بالا را دارید و از دستور go fmt استفاده می‌کنیم خروجی کد بالا به شکل زیر تغییر پیدا می‌کند:
```go
package main
Expand All @@ -196,7 +196,7 @@ func main() {
{{< playground url=65lnwMCf_EV >}}
{{< hint info >}}
در برنامه فوق ما یکسری کلمات کلیدی نظیر `package, import, const, func, var , for, if, else, return` استفاده کردیم و سایر کلماتی که داخل کد فوق دیدید به عنوان {{< tooltip text="شناسه" note="identifier" >}} می باشد. برای اطلاعات بیشتر در خصوص کلید واژه و شناسه لطفا بخش [کلید واژه و شناسه ها](https://book.gofarsi.ir/chapter-1/go-built-in-keywords-identifiers/) را مطالعه فرمایید.
در برنامه فوق ما یکسری کلمات کلیدی نظیر `package, import, const, func, var , for, if, else, return` استفاده کردیم و سایر کلماتی که داخل کد فوق دیدید به عنوان {{< tooltip text="شناسه" note="identifier" >}} هستند. برای اطلاعات بیشتر در خصوص کلید واژه و شناسه لطفاً بخش [کلید واژه و شناسه ها](https://book.gofarsi.ir/chapter-1/go-built-in-keywords-identifiers/) را مطالعه فرمایید.
{{< /hint >}}

0 comments on commit 8c194c7

Please sign in to comment.