Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: GoFarsi/book
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: main
Choose a base ref
...
head repository: de54/GoFarsiBook
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: main
Choose a head ref
Able to merge. These branches can be automatically merged.
  • 14 commits
  • 5 files changed
  • 1 contributor

Commits on Feb 15, 2025

  1. Update 1.3-types.md: تصحیح مقدار پیشفرض تایپ string

    مقدار قبلی " " بود و اکنون به "" تغییر پیدا کرد.
    de54 authored Feb 15, 2025
    Copy the full SHA
    628c003 View commit details
  2. Update 1.4-operators.md: تصحیح جهت عملگرها

    جهت عملگرها به شکل برعکس نوشته شده بده و اصلاح گردید
    de54 authored Feb 15, 2025
    Copy the full SHA
    d5bbe2f View commit details
  3. Update 1.4-operators.md: اصلاح یک پاراگراف به شکل روان

    این پاراگراف به شکلی بازنویسی شد که منظور را به درستی برساند.
    de54 authored Feb 15, 2025
    Copy the full SHA
    e323fec View commit details
  4. Update 1.5-variables.md: افزودن "تعریف متغیر بدون تعیین تایپ"

    در نسخه قبلی ذکر نشده بود که میتوانیم متغیر های var را نیز بدون مشخص کردن تایپ، تعریف کنیم.
    de54 authored Feb 15, 2025
    Copy the full SHA
    0c99ee2 View commit details
  5. Update 1.5-variables.md: توسعه‌ی مثال در بخش تعریف چند متغیر در یک خط

    مثال تعریف چند متغییر با تایپ یکسان نیز اضافه شد!
    de54 authored Feb 15, 2025
    Copy the full SHA
    f69c99f View commit details
  6. Update 1.5-variables.md: گسترده کردن مثال در بخش تعریف متغیر با مقدار…

    … پیشفرض
    
    مثال تعریف متغیر تک خطی با مقدار پیشفرض اضافه شد.
    de54 authored Feb 15, 2025
    Copy the full SHA
    2ef2b51 View commit details
  7. Update 1.5-variables.md: تصحیح خطای مفهومی

    اجرا نه!
    کامپایل درسته!
    de54 authored Feb 15, 2025
    Copy the full SHA
    5ebbdf4 View commit details
  8. Update 1.7-function.md: بازنویسی و متقارن‌سازی سینتکس فانکشن‌ها

    متقارن و اصولی و دارای الگوی مشخص نبود، الان هست...
    de54 authored Feb 15, 2025
    Copy the full SHA
    bf0fd84 View commit details
  9. Update 1.7-function.md: تکمیل قوانین نام گذاری توابع در گولنگ

    نام تابع با _ هم می‌تواند شروع شود.
    de54 authored Feb 15, 2025
    Copy the full SHA
    0a6f8b6 View commit details
  10. Update 1.5-variables.md: تصحیح قوانین نام‌گذاری متغیر و ثابت‌ها

    فقط با حروف انگلیسی نیست!!!
    با حروف فارسی و عربی و چینی هم میشه نام‌گذاری کرد!
    de54 authored Feb 15, 2025
    Copy the full SHA
    0a455fa View commit details
  11. Copy the full SHA
    017422d View commit details
  12. Copy the full SHA
    5019ac5 View commit details
  13. Copy the full SHA
    ae4f964 View commit details
  14. Copy the full SHA
    af9b141 View commit details
Showing with 76 additions and 75 deletions.
  1. +1 −1 content/chapter 1/1.3-types.md
  2. +11 −13 content/chapter 1/1.4-operators.md
  3. +35 −13 content/chapter 1/1.5-variables.md
  4. +28 −47 content/chapter 1/1.7-function.md
  5. +1 −1 content/chapter 1/1.8-array-slice.md
2 changes: 1 addition & 1 deletion content/chapter 1/1.3-types.md
Original file line number Diff line number Diff line change
@@ -61,7 +61,7 @@ weight: 1003
| complex64 | - | 0+0i | ۸ بایت |
| complex128 | - | 0+0i | ۱۶ بایت |
| bool | - | false | ۱ بایت |
| string | - | " " | ۱۶ بایت |
| string | - | "" | ۱۶ بایت |

زبان گو به‌طور پیش‌فرض از دو نوع تایپ با نام مستعار پشتیبانی می‌کند :
- تایپ `byte` این تایپ نام مستعار برای تایپ `uint8` است.
24 changes: 11 additions & 13 deletions content/chapter 1/1.4-operators.md
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@ weight: 1004


{{< hint info >}}
در نمونه کد بالا ما از عملگر `:=` که شیوه تعریف متغیر به روش کوتاه است استفاده کردیم که در بخش [1.5 متغیرها و ثابت ها معرفی](https://book.gofarsi.ir/chapter-1/go-variables-and-consts/) خواهیم کرد.
در نمونه کد بالا ما از عملگر `=:` که شیوه تعریف متغیر به روش کوتاه است استفاده کردیم که در بخش [1.5 متغیرها و ثابت ها معرفی](https://book.gofarsi.ir/chapter-1/go-variables-and-consts/) خواهیم کرد.
{{< /hint >}}

## 1.4.2 عملگرهای مقایسه‌ای
@@ -41,11 +41,11 @@ weight: 1004
| عملگر | نام |
|---|----------|
| `==` | مساوی بودن |
| `=!` | مساوی نبودن با |
| `!=` | مساوی نبودن با |
| `>` | کوچکتر از |
| `=>` | کوچکتر یا مساوی |
| `>=` | کوچکتر یا مساوی |
| `<` | بزرگتر |
| `=<` | بزرگتر یا مساوی |
| `<=` | بزرگتر یا مساوی |

نتیجه استفاده از این عملگرهای مقایسه‌ای, یک نوع untyped بولین است. یعنی حاصل این مقایسه‌ها در واقع true یا false است.

@@ -105,15 +105,15 @@ fmt.Println(!c) //true

| عملگر | نام |
|---|----------|
| `>>` |شیفت بیتی به چپ |
| `<<` | شیفت بیتی به راست |
| `<<` |شیفت بیتی به چپ |
| `>>` | شیفت بیتی به راست |
| `&` | AND |
|&#124; | OR |
| `^` | XOR |

‍‍
- عملگر `>>` به انگلیسی **Zero fill left shift** یا به اختصار **left shift** که به فارسی اسم مناسبی نیافتیم به نقل از [ویکی پدیا](https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D8%A8%DB%8C%D8%AA%DB%8C) **شیفت بیتی به چپ**, مقدار باینری ما را با استفاده از انتقال یا اضافه کردن صفرها به سمت چپ انتقال می‌دهد.
- عملگر `<<` به انگلیسی **Zero fill right shift** یا به اختصار **right shift** که به فارسی اسم مناسبی نیافتیم به نقل از [ویکی پدیا](https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D8%A8%DB%8C%D8%AA%DB%8C) **شیفت بیتی به راست**, مقدار باینری ما را با به سمت راست انتقال می‌دهد.
- عملگر `<<` به انگلیسی **Zero fill left shift** یا به اختصار **left shift** که به فارسی اسم مناسبی نیافتیم به نقل از [ویکی پدیا](https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D8%A8%DB%8C%D8%AA%DB%8C) **شیفت بیتی به چپ**, مقدار باینری ما را با استفاده از انتقال یا اضافه کردن صفرها به سمت چپ انتقال می‌دهد.
- عملگر `>>` به انگلیسی **Zero fill right shift** یا به اختصار **right shift** که به فارسی اسم مناسبی نیافتیم به نقل از [ویکی پدیا](https://fa.wikipedia.org/wiki/%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA_%D8%A8%DB%8C%D8%AA%DB%8C) **شیفت بیتی به راست**, مقدار باینری ما را با به سمت راست انتقال می‌دهد.


در زیر دو مثال رو مشاهده می‌کنید که از این دو عملگر استفاده شده:
@@ -141,7 +141,7 @@ fmt.Printf("binary:%08b,value:%v", f, f) //binary:00001010,value:10
fmt.Println("")
*/
```
در مثال دو همانطور که مشاهده کردید زمانی که از عملگر `>>` استفاده کردید در صورتی که اولین خانه باینری از سمت چپ مقدار 1 داشته باشد مابقی مقدار به صورت 0 به باینری اضافه می‌شود و در غیر این صورت 1 ها به همان مقدار به سمت چپ خواهد رفت.
در مثال دو همانطور که مشاهده کردید زمانی که از عملگر `<<` استفاده کردید در صورتی که اولین خانه باینری از سمت چپ مقدار 1 داشته باشد مابقی مقدار به صورت 0 به سمت راست عدد باینری اضافه می‌شود و طول عدد باینری افزایش می‌یابد و در غیر این صورت 1 ها به همان مقدار به سمت چپ خواهد رفت.

{{< hint info >}}
در واقع `08b%` یک شناساگر قالب (format specifier) برای نمایش باینری در هشت خانه است در [اینجا](https://pkg.go.dev/fmt) می‌توانید بیشتر راجب شناساگرهای قالب بخوانید.
@@ -150,10 +150,8 @@ fmt.Println("")


- عملگر `&` به انگلیسی **AND** به فارسی **و** دو مقدار باینری رو با یک دیگر مقایسه و اگر هر بیت مقدار 1 در هر دو طرف داشته باشد آن را 1 نگه می‌دارد و در غیر اینصورت آن بیت را 0 می‌کند.
-
- عملگر `|` به انگلیسی **OR** به فارسی **یا** دو مقدار باینری رو با یک دیگر مقایسه و اگر هر بیت مقدار 1 در یک طرف یا هر دوطرف داشته باشد آن را 1 نگه می‌دارد و در غیر اینصورت آن بیت را 0 می‌کند.

عملگر `^` به انگلیسی **XOR** به فارسی **نامی ندارد** دو مقدار باینری رو با یک دیگر مقایسه و اگر هر بیت مقدار 1 در هر دوطرف داشته باشد آن را 0 می‌کند.
- عملگر `^` به انگلیسی **XOR** به فارسی **نامی ندارد** دو مقدار باینری رو با یک دیگر مقایسه و اگر هر بیت مقدار 1 در هر دوطرف داشته باشد آن را 0 می‌کند.
```go
//& operator example
a := 0b01000101
@@ -206,5 +204,5 @@ fmt.Printf("binary:%08b,value:%v", i, i) //binary:00010001,value:17
```

{{< hint warning >}}
توجه در زبان گو اولویت `<<` و `>>` بیشتر از + و - است.
توجه در زبان گو اولویت `>>` و `<<` بیشتر از + و - است.
{{< /hint >}}
48 changes: 35 additions & 13 deletions content/chapter 1/1.5-variables.md
Original file line number Diff line number Diff line change
@@ -87,7 +87,26 @@ $ go run main.go

در کد بالا ما یک {{< tooltip text="متغیر" note="Variable" >}} از نوع `int` تعریف کردیم و در خط ۹ مقدار `"One"` را به آن تخصیص دادیم و پس از اجرا با خطای `cannot use "One" (type string) as type int in assignment` مواجه شدیم. این خطا یعنی اینکه شما یک مقدار رشته را به تایپ اشتباه اختصاص داده‌اید.

### 1.5.1.3 تعریف متغیر به صورت خلاصه
### 1.5.1.3 تعریف متغیر بدون تعیین تایپ

در زبان گو شما می‌توانید یک {{< tooltip text="متغیر" note="Variable" >}} را بدون مشخص کردن تایپ تعریف کنید؛ زبان گو بر اساس مقداری که برای {{< tooltip text="متغیر" note="Variable" >}} تعیین کرده‌اید، تایپ متغیر را تشخیص می‌دهد.

```go
package main

import (
"fmt"
)

func main() {
var s := "Hello world!"
fmt.Println(s)
}
```

{{< playground url=mch4lGdSz3s >}}

### 1.5.1.4 تعریف متغیر به صورت خلاصه

زبان گو علاوه بر اینکه از {{< tooltip text="کلید واژه" note="keyword" >}} `var` برای تعریف متغیر پشتیبانی می‌کند, از `=:` به انگلیسی `short variable declaration` نیز برای تعریف متغیرها پشتیبانی می‌کند. شما می‌توانید یک {{< tooltip text="متغیر" note="Variable" >}} تعریف کنید و نیازی به مشخص کردن تایپ متغیر نیست، چون زبان گو بر اساس مقدار تعیین شده تایپ متغیر را تشخیص می‌دهد.

@@ -129,7 +148,7 @@ func main() {

{{< /hint >}}

### 1.5.1.4 تعریف چند متغیر در یک خط
### 1.5.1.6 تعریف چند متغیر در یک خط

در زبان گو شما می‌توانید همزمان چند متغیر را در یک خط تعریف کنید که در زیر یک نمونه کد مثال زدیم :

@@ -140,19 +159,21 @@ import "fmt"

func main() {
a, b, c := "hello", 1, 1.5
var d, e, f = "world", 13, 24
fmt.Println(a, b, c, d, e, f)
var d, e, f = "world!", 13, 24
var g, h, i string = "|", "hello", "world!"

fmt.Println(a, b, c, d, e, f, g, h, i)
}
```

```shell
$ go run main.go
hello 1 1.5 world 13 24
hello 1 1.5 world! 13 24 | hello world!
```

{{< playground url=lJks2BT3ejm >}}

### 1.5.1.5 تعریف متغیر با مقدار پیش‌فرض
### 1.5.1.7 تعریف متغیر با مقدار پیش‌فرض

در کد زیر ما یکسری متغیر با تایپ‌های مختلف تعریف کردیم که با مقدار پیش‌فرض ایجاد شده‌اند.

@@ -162,11 +183,12 @@ package main
import "fmt"

func main() {
var i int
var f float32
var b bool
var s string
fmt.Printf("%v %v %v %q\n", i, f, b, s) //0 0 false ""
var i int
var f float32
var b bool
var s string
var x, y, z int32
fmt.Printf("%v %v %v %q\n", i, f, b, s, x, y, z) //0 0 false "" 0 0 0
}
```

@@ -217,7 +239,7 @@ main.go:5:cannot assign to a

### 1.5.2.1 تعریف Constant بدون نیاز به تعیین تایپ

در تعریف `ثابت`‌ها همانند متغیر ها شما می‌توانید یک `ثابت` بدون تعیین تایپ تعریف کنید و زبان گو در زمان اجرا با توجه به مقدار اختصاص داده شده به `ثابت` شما, تایپ را تشخیص می دهد.
در تعریف `ثابت`‌ها همانند متغیر ها شما می‌توانید یک `ثابت` بدون تعیین تایپ تعریف کنید و زبان گو در زمان کامپایل با توجه به مقدار اختصاص داده شده به `ثابت` شما, تایپ را تشخیص می دهد.

```go
const a = 1 //Default hidden type is int
@@ -385,7 +407,7 @@ func main() {

در زیر ما یکسری قوانین جهت نام‌گذاری متغیر و `تابت`‌ها تعریف کرده‌ایم :

- نام متغیر یا ثابت باید با یک حرف انگلیسی یا `_` شروع شود.
- نام متغیر یا ثابت باید با یک حرف یا `_` شروع شود.
- نام‌ها می‌توانند ترکیبی از اعداد و حروف انگلیسی یا `_` باشد.
- زبان گو به حروف بزرگ و کوچک در نام ها حساس است و اگر شما `hello` یا `Hello` را تعریف کنید, ۲ متغیر یا ثابت متفاوت محسوب می‌شوند.
- محدودیتی در تعداد حروف نام‌ها وجود ندارد ولی بهتر است از یک تعداد مطلوب و مشخصی برای نام‌ها استفاده کنید.
Loading