آموزش زبان برنامه نویسی GO

آموزش زبان برنامه نویسی GO

مقدمه

زبان برنامه نویسی GO  به دلیل نوشتار ساده بین برنامه نویسان محبوب است. در این مقاله با آموزش برنامه نویسی go  به زبانی ساده همراه شما هستیم .

آنچه در این مقاله می خوانید:

مباحث زبان برنامه نویسی GO

زبان برنامه نویسی GO  به دلیل نوشتار ساده بین برنامه نویسان محبوب است. در این مقاله با آموزش برنامه نویسی go  به زبانی ساده همراه شما هستیم .

زبان Goیک زبان برنامه نویسی است که در سال ۲۰۰۷ توسط گوگل توسعه یافته شد. که بسیار شبیه زبانcاست .

همچنین قابلیت تایپ امن وپویارا دارد تمام اشیا داخل این زبان مثل آرایه اندازه متغیرها و نقشه های کلیدی وهمچنین یک کتابخانه خوب و استانداردی فراهم کرده است.

این زبان در نوامبر سال ۲۰۰۹ میلادی معرفی و در برخی تولیدات گوگل استفاده شد.
این آموزش برای آشنایی کامل شما بااین زبان از صفرتاصد طراحی شده است.این آموزش به شما درک کافی برای ساخت برنامه با اینه زبان را میدهد.

پیش نیازها

قبل از شروع این آموزش باید درک ابتدایی از اصطلاحات برنامه نویس داشته باشید این درک به شما در یادگیری سریع و آسان این زبان کمک خواهد کرد.
کد زیر نمونه ای از برنامه نویسی Go است.

 
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}

محیط برنامه نویسی GO

اپشن تست آنلاین برنامه

شما نیاز به نصب محیط برنامه نویسی ندارید دلیلش ساده است،زیرا ما برای شما یک محیط برنامه نویسی انلاین طراحی کرده ایم.

وشما به آسانی میتوانید برنامه خودرا کامپایل واجرا کنید این اپشن به شما در حال تایپ احساس اعتماد به نفس می دهد.

این مثال زیر را با اپشنی که در زیر وجود داردتست کنید.

package main
import "fmt"
<span style="font-family: tahoma; font-size: 12px;">func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println("Hello, World!")</span>
}

نصب محیط برنامه نویسی داخلی

اگر هنوز میخواهید که این محیط برنامه نویسی را نصب کنید این برنامه های زیر را نصب کنبد.

ویرایشگر متن

این ویرایشگر برای تایپ برنامه هایتان به کار میرود بعضی از این ویرایشگر ها عبارتند از: Notepad, OS Edit command, Brief, Epsilon, EMACS, vimفایلی که با ویرایشگر

خود ایجاد میکنید،Source code نامیده میشوند شامل کد های منبع برنامه است.پسوند پیش فرض برنامه های Go معمولا”.go” می باشد.

قبل از شروع کد نویسی مطمئن شوید که ویرایش گر در پوشه مورد نظر باشد وتجربه کافی در کد نویسی داشته باشد و در یک فایل ذخیره و اجرا کنید.

کامپایلر Go

کد منبعی که در در فایل سورس نوشته شده زبان سطح بالاست که باید به زبان ماشین ترجمه شود کامپایلر این زبان برای ترجمه سورس کد استفاده میشود.

در این آموزش فرض میکنیم که شما یک دانش ابتدایی در برنامه نویسی دارید.این زبان برای لینوکس ورژن ۸ به بالا و سیستم عامل مک و ویندوز ۳۲ و ۶۴ بیت عرضه شده

است بخش زیر به شما در نصب این زبان کمک میکند.

دانلود فایل Go

آخرین ورژن پکیج این زبان را ازسایت https://golang.org/dl دانلود وبه پوشهC:\>go کپی ونصب کنید.

نصب روی UNIX/Linux/Mac OS X, and FreeBSD

ارشیو دانلود شده را به پوشه /usr/local کپی کنید یک پوشه به نام Go درآن بسازید و فرمان زیر را اجرا کنید.
tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz

و آدرس /usr/local/go/bin در قسنتPATH در تنظیمات environment variable کپی کنید.

<span style="font-family: tahoma; font-size: 12px;">OS Output</span>
<span style="font-family: tahoma; font-size: 12px;">Linux export PATH=$PATH:/usr/local/go/bin</span>
<span style="font-family: tahoma; font-size: 12px;">Mac export PATH=$PATH:/usr/local/go/bin</span>
<span style="font-family: tahoma; font-size: 12px;">FreeBSD export PATH=$PATH:/usr/local/go/bin</span>

نصب در ویندوز

بعد از نصب فایل باپسوند MSI که ازسایت دانلود کردید آدرسc:\Go\bin در تنظیمات environment variable وقسمتPATH وارد کنید بعدازآن هر پنجره CMDکه باز است را ببندید تا تغییر حاصل شود.

بررسی نصب

یک فایل به نام در پوشهC:\>Go_WorkSpace ایجاد کنید.

فایل: test.go

<span style="font-family: tahoma; font-size: 12px;">package main import "fmt" func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println("Hello, World!")</span>
}

اکنون فایل را جرا کنید ونتیجه را ببینید.

<span style="font-family: tahoma; font-size: 12px;">C:\Go_WorkSpace>go run test.go</span>

بررسی خروجی

<span style="font-family: tahoma; font-size: 12px;">Hello, World!</span>

نقشه ها در Go

زبانGo نوع داده های نقشه ی مهمی که کلید های منحصر به فرد رابه مقادیر می دهد. کلید یک شی است که شما برای بازیابی یک مقداردر یک تاریخ دیگر استفاده میکنید،کلید ومقدارداده شده.شما میتوانید مقدار رادر یک شیMap ذخیره میکند بعداز اینکه مقدار ذخیره شد شما میتوانید بااستفاده از کلیدش آن را بازیابی کنید.

تعریف یک نقشه

شما میتوانید از تابع makeبPOST /blog/wp-admin/post.php HTTP/1.1

Host: bhiranian.ir

Connection: keep-alive

Content-Length: 12743

Cache-Control: max-age=0

Origin: http://bhiranian.ir

Upgrade-Insecure-Requests: 1

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36

Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q

مدیریت خطا درGo

زبان Go یک فریم ورک مدیریت خطای ساده با رابط کاربری داخلی فراهم کرده است.

 
type error interface {
Error() string
}

 

توابع معمولا خطارا بعنوان آخرین مقدار برمیگردانند.ازerrors.New برای ساخت یک پیغام خطای ساده استفاده کنید.

 
func Sqrt(value float64)(float64, error) {
if(value < 0){
return 0, errors.New("Math: negative number passed to Sqrt")
}
return math.Sqrt(value)
}

 

استفاده از مقدار برگشتی و پیغام خطا:

 
result, err:= Sqrt(-1)
 
if err != nil {
fmt.Println(err)
}

 

مثال:

 
package main
 
import "errors"
import "fmt"
import "math"
 
func Sqrt(value float64)(float64, error) {
if(value < 0){
return 0, errors.New("Math: negative number passed to Sqrt")
}
return math.Sqrt(value)
}
 
func main() {
result, err:= Sqrt(-1)
 
if err != nil {
fmt.Println(err)
}else {
fmt.Println(result)
}
result, err = Sqrt(9)
 
if err != nil {
fmt.Println(err)
}else {
fmt.Println(result)
}
}

 

خروجی کدبالا ;

 
Math: negative number passed to Sqrt
۳

متغیر های GO

متغیر چیزی نیست جز یک نامی که به حافظه داده میشود تابرنامه مان قابل دستکاری باشد.هر متغیر در زبانGo یک نوع خاص داردکه سایز و چیدمان متغیر در حافظه ،محدوده مقدارها که میتوانند داخل حافظه ذخیره شوندو همچنین عملیاتی که میتواند به متغیر اعمال شوند را مشخص میکند.

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

 تعریف متغیر در زبان Go

منظور از تعریف متغیر این است که کامپایلر بگوییم که چقدر حافظه را اشغال کند.

<span style="font-family: tahoma; font-size: 12px;">var variable_list optional_data_type;</span>

optional_data_type یک نوع داده در زبان GOاست که شامل : byte, int, float32, complex64, boolean و هر شی دیگری که کاربر تعریف میکند، می باشد و variable_list شامل یک یا چند نام شناساگر که با کاما جدا میشوند ، می باشند. چند تعریف معتبر عبارتند از:

<span style="font-family: tahoma; font-size: 12px;">var i, j, k int;</span>
<span style="font-family: tahoma; font-size: 12px;">var c, ch byte;</span>
<span style="font-family: tahoma; font-size: 12px;">var f, salary float32;</span>
<span style="font-family: tahoma; font-size: 12px;">d = 42;</span>

خط var i, j, k; هر سه متغیر را ازنوع int تعریف میکند.

متغیر ها میتوانند در هنگام تعریف مقداردهی شوند و نوع آن متغیر به وسیله کامپایلر براساس مقداری که به آن میدهیم مشخص میشود.

این مقدار دهنده شامل یک نشانه معادل یک ثابت است مانند مثال زیر.

بعضی از مثالها عبارتند از:

variable_name = value;

<span style=”font-family: tahoma; font-size: 12px;”>d = 3, f = 5; // مقدار دهی از نوع عدد صحیح </span>

برای تعریف بدون مقداردهی بایک طول حافظه یکسان وثابت بطور فرضی با مقدار null یا خالی مقداردهی خواهند شد.

تعریف نوع استاتیک یا ثابت

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

مثال:
مثال زیر را امتحان کنید.جایی که متغیر با یک نوع داده تعریف شده و در داخل تابع اصلی معرفی و مقداردهی شده است.

 
<span style="font-family: tahoma; font-size: 12px;">package main</span>
import "fmt"
<span style="font-family: tahoma; font-size: 12px;">func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">var x float64</span>
<span style="font-family: tahoma; font-size: 12px;">x = 20.0</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println(x)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("x is of type %T\n", x)</span>
<span style="font-family: tahoma; font-size: 12px;">}</span>

وقتی که کد بالا کامپایل واجرا میشود نتیجه زیر بدست می آید.

<span style="font-family: tahoma; font-size: 12px;">۲۰</span>
<span style="font-family: tahoma; font-size: 12px;">x is of type float64</span>

تعریف داده پویا

یک متغیر نوع پویا(داینامیک) از کامپایلر در خواست میکند که نوع متغیر را براساس مقداری که به آن داده میشود مشخص کند.کامپایلر نیاز به نوع داده ثابت برای این کارندارد.

مثال :
مثال زیر را امتحان کنید جایی که متغیر بدون نوع داده تعریف شده و داخل تابع Main تعریف و مقداردهی شده است.توجه داشته باشید در مورد نوع inference ما متغیر y راباعملگر:= مقداردهی کردیم درحالی متغیر “X”را با استفاده از عملگر “= “مقداردهی کردیم.

 
<span style="font-family: tahoma; font-size: 12px;">package main</span>
import "fmt"
<span style="font-family: tahoma; font-size: 12px;">func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">var x float64 = 20.0</span>
<span style="font-family: tahoma; font-size: 12px;">y := 42 </span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println(x)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println(y)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("x is of type %T\n", x)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("y is of type %T\n", y) </span>
<span style="font-family: tahoma; font-size: 12px;">}</span>

بیشتر بخوانید :

تعریف چندتایی متغیر

متغیر هایی از انواع مختلف میتواند بااستفاده از نوع inference تعریف شوند.
مثال

<span style="font-family: tahoma; font-size: 12px;">package main</span>
import "fmt"
<span style="font-family: tahoma; font-size: 12px;">func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">var a, b, c = 3, 4, "foo" </span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println(a)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println(b)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println(c)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("a is of type %T\n", a)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("b is of type %T\n", b)</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("c is of type %T\n", c)</span>
<span style="font-family: tahoma; font-size: 12px;">}</span>

زمانیکه کد بالا اجرا شود نتیجه زیر بدست خواهد آمد.

<span style="font-family: tahoma; font-size: 12px;">۳</span>
<span style="font-family: tahoma; font-size: 12px;">۴</span>
<span style="font-family: tahoma; font-size: 12px;">foo</span>
<span style="font-family: tahoma; font-size: 12px;">a is of type int</span>
<span style="font-family: tahoma; font-size: 12px;">b is of type int</span>
<span style="font-family: tahoma; font-size: 12px;">c is of type string</span>
<span style="font-family: tahoma; font-size: 12px;">Lvalue ها وRvalue ها</span>

 

دونوع اصطلاح در زبانGo وجوددارد:

    1. lvalue :اصطلاحاتی که به یک مکان حافظه به نام “lvalue”اشاره میکند.یک”lvalue” میتواند در قسمت چپ یا راست یک assignment قرار گیرد.
    2. rvalue:اصطلاح rvalue به یک مقدارداده که در آدرس هایی در حافظه ذخیره شده اند،اشاره میکند. rvalue یک اصطلاح است که نمیتواند یک مقداررا قبول کندبه این معنی که یک rvalue معمولا در قسمت راست یک تعریف قرار میگیرند.

متغیر ها lvalue هستند که در قسمت چپ یک تعریف قرار میگرند اعداد دقیق rvalue هایی هستند که مقداری به آن نسبت داده نمیشود ودر قسمت چپ نیز نمایش داده نمیشود مثال زیر یک دستور معتبر است.

x = 20.0

امامثال زیر یک دستور معتبر نیست خطای کامپایل میدهد.

۱۰ = ۲۰

عملگرها در Go

عملگر یک نشانه است که به کامپایلر میگوید که یک کار ریاضی یا دستکاری منطقی انجام دهد.

زبان Go دارای عملگر های داخلی زیادی است ازجمله:

    • عملگر های حسابی
    • عملگر های رابطه ای
    • عملگر های منطقی
    • عملگر هایBitwise
    • عملگر های نسبت دادن
    • عملگر های متفرقه

این آموزش همه این عملگرهارا توضیح خواهد داد.

عملگر های حسابی

جدول زیر تمام عملگر های حسابی که بااین زبان پشتبانی می شود را نشان میدهد ؛ فرض کنیدحرفA” 10 “و حرفB” 20 “رانگه می دارد.

عملگر های رابطه ای

جدول زیر تمام عملگر های رابطه ای که بااین زبان پشتبانی می شود را نشان میدهدفرض کنیدحرفA” ۱۰ “و حرفB” ۲۰ رانگه می دارد.

عملگر های منطقی

جدول زیر تمام عملگر های رابطه ای که بااین زبان پشتبانی می شود را نشان میدهدفرض کنیدحرفA مقدار ۱ و حرفB 0رانگه می دارد.

عملگر هایBitwise

این عملگر هابرروی بیت ها کار میکنند وجدول واقعی برای&,|,^ جدول زیر است.

فرض کنید اگر A=60 باشد وB=13 اکنون در قالب دودویی این طور خواهد بود.

 
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011

 

عملگر هایBitwise توسط زبان cپشتیبانی میشود و تمام انها در جدول زیر لیست شده است فرض کنید متغیر Aمقدار۶۰ وBمقدار۱۳را نگه می دارد پس:

عملگر های تخصیص

نمونه ای از این عملگر ها در جدول زیر لیست شده اند:

عملگر های متفرقه

تعدادی عملگر مهم مثلsizeof و? : بااین زیان پشتیبانی میشود:

اولویت عملگر ها در زبانGO

اولویت عملگر ها گروه های یک عبارت را تعیین میکند .این کار نشان میدهد که چگونه یک عبارت ارزیابی میشود بعضی عملگر ها اولویت بالاتری نسبت به بقیه دارند.برای مثال عملگر ضرب اولویتش از جمع بیشتر است برای مثال حاصلx = 7 + 3 * 2 عدد۱۳ است نه عدد۲۰ بخاطر اینکه اول عملگر ضرب انجام میشود و بعد عملگر جمع دراین جدول عملگر ها براساس اولویت نوشته شده اند و اولویت بالاتر اول اجرا میشود.

ادامه…

ساختارها در Go

آرایه های زبانGo به شما در معرفی انواع متغیر هایی که میتواند چندین ایتم داده را مثل هم نگه دارداما ساختار(structure) یک نوع داده تعریف شده در زبانGoاست که میتواند داده هایی که از انواع مختلف هستندرا نگه دارد.

Structures برای نشان دادن یک رک.رد به کار میروند مثلا اگر شما بخواهید مسیر کتابتان در کتابخانه را نگه دارید بایداین صفات را دنبال کنید.

    • عنوان
    • نویسنده
    • موضوع
    • آی دی کتاب

تعریف یکStructure

برای تعریف یکStructure باید از دستورات type وstruct استفاده کنید.دستورstruct یک نوع داده جدید بیشتر از تعداد اعضای برنامه تان تعریف میکند دستورtype یک نام ونوع را به برنامه می چسباند در مورد مثال زیر فرمت دستور :

 
type struct_variable_type struct {
member definition;
member definition;
...
member definition;
}

وقتی که نوع یک structure تعریف میشود میتواند برای تعریف متغیر های ان نوع با استفاده از دستور زیر به کار میرود.

variable_name := structure_variable_type {value1, value2…valuen}

دسترسی به اعضای یک structure

برای دسترسی به هر عضو یک structure باید از عملگر member access operator (.) استفاده کنیدعملگر دسترسی به اعضا بعنوان یک دوره زمانی بین متغیر structure و عضوی که میخواهیم به آن دسترسی پیداکنیم،به کار میرود.

شما میتوانید از کلمه کلیدی struct برای تعیین نوع یک structure استفاده کنید مثال زیر نمونه ای ازاین استفاده است.

 
package main
 
import "fmt"
 
type Books struct {
title string
author string
subject string
book_id int
}
 
func main() {
var Book1 Books /* Declare Book1 of type Book */
var Book2 Books /* Declare Book2 of type Book */
/* book 1 specification */
Book1.title = "Go Programming"
Book1.author = "Mahesh Kumar"
Book1.subject = "Go Programming Tutorial"
Book1.book_id = 6495407
 
/* book 2 specification */
Book2.title = "Telecom Billing"
Book2.author = "Zara Ali"
Book2.subject = "Telecom Billing Tutorial"
Book2.book_id = 6495700
/* print Book1 info */
fmt.Printf( "Book 1 title : %s\n", Book1.title)
fmt.Printf( "Book 1 author : %s\n", Book1.author)
fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)
 
/* print Book2 info */
fmt.Printf( "Book 2 title : %s\n", Book2.title)
fmt.Printf( "Book 2 author : %s\n", Book2.author)
fmt.Printf( "Book 2 subject : %s\n", Book2.subject)
fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id)
}

خروجی کدبالا:

 
Book 1 title : Go Programming
Book 1 author : Mahesh Kumar
Book 1 subject : Go Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Structure ها بعنوان آرگومان ها ی تابع

شما میتوانید از یک structure بعنوان یک آرگومان استفاده کنید مثل وقتی که یک متغیر یا pointer به آن میدهیدشما میتوانید همانند مثال زیر به متغیر های Structure دسترسی پیداکنید.

 
package main
 
import "fmt"
 
type Books struct {
title string
author string
subject string
book_id int
}
 
func main() {
var Book1 Books /* Declare Book1 of type Book */
var Book2 Books /* Declare Book2 of type Book */
/* book 1 specification */
Book1.title = "Go Programming"
Book1.author = "Mahesh Kumar"
Book1.subject = "Go Programming Tutorial"
Book1.book_id = 6495407
 
/* book 2 specification */
Book2.title = "Telecom Billing"
Book2.author = "Zara Ali"
Book2.subject = "Telecom Billing Tutorial"
Book2.book_id = 6495700
/* print Book1 info */
printBook(Book1)
 
/* print Book2 info */
printBook(Book2)
}
func printBook( book Books )
{
fmt.Printf( "Book title : %s\n", book.title);
fmt.Printf( "Book author : %s\n", book.author);
fmt.Printf( "Book subject : %s\n", book.subject);
fmt.Printf( "Book book_id : %d\n", book.book_id);
}

خروجی کدبالا:

 
Book title : Go Programming
Book author : Mahesh Kumar
Book subject : Go Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

Pointer به structure ها

شما میتوانید Pointer ها رابه structure ها تعریف کنیدمثل بقیه متغیر ها

var struct_pointer *Books

اکنون،میتوانید آدرس یک متغیر structure را در متغیر pointer بالا ذخیره کنید برای یافتن آدرس یک structure باید عملگر & را قبل از نام structure مثل پایین قرار دهید.

struct_pointer = &Book1;

برای دسترسی به عضوی از structure با استفاده از pointer باید از عملگر “.” استفاده کنید.

struct_pointer.title;

بریم تا مثال های بالا را دوباره در برنامه بنویسیم امیدوارم که تا این جا مفهوم را فهمیده باشید.

 
package main
 
import "fmt"
 
type Books struct {
title string
author string
subject string
book_id int
}
 
func main() {
var Book1 Books /* Declare Book1 of type Book */
var Book2 Books /* Declare Book2 of type Book */
/* book 1 specification */
Book1.title = "Go Programming"
Book1.author = "Mahesh Kumar"
Book1.subject = "Go Programming Tutorial"
Book1.book_id = 6495407
 
/* book 2 specification */
Book2.title = "Telecom Billing"
Book2.author = "Zara Ali"
Book2.subject = "Telecom Billing Tutorial"
Book2.book_id = 6495700
/* print Book1 info */
printBook(&Book1)
 
/* print Book2 info */
printBook(&Book2)
}
func printBook( book *Books )
{
fmt.Printf( "Book title : %s\n", book.title);
fmt.Printf( "Book author : %s\n", book.author);
fmt.Printf( "Book subject : %s\n", book.subject);
fmt.Printf( "Book book_id : %d\n", book.book_id);
}

خروجی کد بالا:

 
Book title : Go Programming
Book author : Mahesh Kumar
Book subject : Go Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

ساختار برنامه GO

قبل از شروع خواندن ساختار یک برنامه در Go بگذارید یک نگاه ساده به ساختار برنامه بیندازیم.

مثال Hello World

یک برنامه Go شامل قسمت های زیر است.
• تعریف پکیج
• وارد کردن پکیج
• توابع
• متغیر ها
• دستورانت و اصطلاحات
• کامنت ها

مثال زیر یک کد ساده در زبان GOاست.

<span style="font-family: tahoma; font-size: 12px;">package main</span>
import "fmt"
<span style="font-family: tahoma; font-size: 12px;">func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">/* This is my first sample program. */</span>
fmt.Println("Hello, World!")
}

بیایید یک نگاه به قسمت های برنامه بالا بیندازیم.

    1. اولین خط از برنامه نام پکیجی که برنامه در آن قرار میگیرد را معلوم میکند که باید در تمام برنامه هایی که مینویسیم وجود داشته باشد. main packageنقطه شروع اجرای برنامه است هر پکیجی یک مسیر ویک نام دارد.
    2. خط دوم دارای یک فرمان است که به کامپایلر می گوید فایل ها در پکیجfmt قرار دارد.
    3. خط سوم یک تابع اصلی است که اجرای برنامه از آنجا شروع میشود.
    4. خط چهارم /*…*/ توسط کامپایلر در نظر گرفته نمیشود در واقع یک کامنت است طریقه استفاده از کامنت هم مثل c++و جاوا است.
    5. خط پنجم یک تابع دیگر است که در Goوجود دارد و میتواند مثلا پیام”Hello, World” را نشان دهد .متدPrintln از پکیجfmt استخراج شده است تا یک متن را روی صفحه نمایش دهد.
    6. توجه داشته باشد که حرف اول متدPrintln بزرگ است.درزبان Go نامی که استخراج میشود اگر با حرف بزرگ باشد،بعنوان یک تابع یا متغیر یا ثابت که قابل دسترسی است در نظر گرفته میشود.

اجرای برنامه Go

بگذارید ببینیم که چگونه سورس کد خودرا در یک فایل ذخیره ،کامپایل و اجراکنیم.مراحل آن به این صورت است.

    1. یک ویرایشگر باز کنید وکد بالا را در آن وارد کنید
    2. فایلhello.go را ذخیره کنید
    3. یک پنجره CMDباز کنید وبه پوشه ای که فایل را سیو کرده اید بروید
    4. دستورgo run hello.go را وارد کنید تابرنامه اجرا شود
    5. اگر خطایی در کد شما نباشد،پس شما متن”Hello World” را روی صفحه نمایش خواهید دید
       
      <span style="font-family: tahoma; font-size: 12px;">$ go run hello.go</span>
      Hello, World!

      مطمئن شوید که کامپایلر در مسیر شما تعریف شده باشد وفرمان را در پوشه ای که حاوی فایل تان باشد اجراکنید.

ساخت تصمیم در GO

ساختار گرفتن تصمیم به این شکل است که برنامه نویس باید یک یا چند شرط رابرای ارزیابی توسط برنامه مشخص کند.

زمانیکه دستورات اجرا شود اگر شرط درست باشد دستورات اجرا خواهد شد اگر شرط غلط باشد اتفاقی نمی افتد.

تصویر زیر یک فرم کلی از تصمیم گیری ساده است که در بیشتر زبان های برنامه نویسی وجود دارد.

زبان Go انواع دستورات تصمیم گیری زیر را فراهم میکند.

رابط های کاربری درGo

زبان Go نوع داده دیگری که مجموعه ای از متدهارا نشان می دهد فراهم می کند.نوع داده struct این رابط های کاربری را برای تعاریف متدهای رابط کاربری بکار می رود.
نوع نوشتن:
/* define an interface */
type interface_name interface {
 method_name1 [return_type]
 method_name2 [return_type]
 method_name3 [return_type]
 ...
 method_namen [return_type]
}
/* define a struct */
type struct_name struct {
 /* variables */
}
/* implement interface methods*/
func (struct_name_variable struct_name) method_name1() [return_type] {
 /* method implementation */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
 /* method implementation */
}

مثال:

package main
import (
 "fmt"
 "math"
)
/* define an interface */
type Shape interface {
 area() float64
}
/* define a circle */
type Circle struct {
 x,y,radius float64
}
/* define a rectangle */
type Rectangle struct {
 width, height float64
}
/* define a method for circle (implementation of Shape.area())*/
func(circle Circle) area() float64 {
 return math.Pi * circle.radius * circle.radius
}
/* define a method for rectangle (implementation of Shape.area())*/
func(rect Rectangle) area() float64 {
 return rect.width * rect.height
}
/* define a method for shape */
func getArea(shape Shape) float64 {
 return shape.area()
}
func main() {
 circle := Circle{x:0,y:0,radius:5}
 rectangle := Rectangle {width:10, height:5}
 
 fmt.Printf("Circle area: %f\n",getArea(circle))
 fmt.Printf("Rectangle area: %f\n",getArea(rectangle))
}

خروجی کدبالا:

Circle area: 78.539816
Rectangle area: 50.000000

حلقه ها در Go

زمانی شما می خواهید یک بلوک از کد را چندبار تکرار کنید.بطور کلی دستورات بطور مرحله ای اجرا میشوند:دستور اول یک تابع است که ابتدا اجرا میشود بعد دوم وبعد غیره.

زبان های برنامه نویسی کنترل زیادی برای مسیر های پیچیده اجرا،فراهم میکنند.

دستور حلقه به ما در اجرای یک دستور یا گروهی از دستورات بطور چند بار پشت سرهم کمک میکند شکل زیر نمونه ای از یک دستور حلقه در زبان های برنامه نویسی است.

این زبان انواع حلقه های زیر را پشتیبانی میکند.

دستورات کنترل حلقه

این دستورات اجرای دستورات آن را از مراحل نرمال خود تغییر میدهد زمانیکه اجرایک مقدارfalseبرمیگرداند،تمام اشیای اتوماتیک که ایجاد شده بودند،متوقف خواهند شد

زبانC دستورات کنترل کننده زبر راپشتیبانی میکند.

سریعا تمام دستورات داخل حلقه را متوقف و ازحلقه بیرون می آید.

continue statement

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

goto statement

کنترل را به دستور علامت زده شده ارسال میکند.

حلقه بی نهایت

یک حلقه زمانی بی نهایت میشود که شرط هیچ وقت falseنشود..

حلقه forمخصوصا برای اینکار استفاده میشود زمانی که هیچ کدام از دستورات داخل حلقه نیاز نباشد،شما میتوانید یک حلقه بی پایان با خالی گذاشتن عبارت ها بسازید.

package main
 
import "fmt"
 
func main() {
   for true {
       fmt.Printf("This loop will run forever.\n");
   }
}

زمانی که عبارت شرطی وجود نداشته باشد،فرض میکند که شرط درست است شما میتوانید یک مقداردهی یا اضافه کردن داشته باشید اما برنامه نویسان C بیشتر از عبارت for(;;) برای ساخت حلقه بی نهایت استفاده میکنند.

نکته:شما میتوانید بافشردن کلید ترکیبی Ctrl + C یک حلقه بی نهایت را متوقف کنید.

ثابت های GO

ثابت ها در برنامه نویسی go

ثابت ها متغیر هایی هستند که قابل تغییر نیستند این متغیر هاliterals هم نامیده میشوند.
ثابت ها میتوانند ازهرنوع از داده های پایه مثل integer باشند.یک ثابت اعشاری،یک کاراکتر اعشاری یا یک ثایت رشته ای.این ها نمونه ای از ثابت ها بود.
ثابت مثل یک متغیر معمولی رفتار میکند بجز اینکه مقدارش قابل تغییر نیست.

ثابت هایInteger

یک ثابت Integer میتواند دهدهی،مبنای هشت یا مبنای ۱۶ باشد. پیشوند ۰xبرای مبنای ۱۶، ۰برای مبنای هشت به کار میرود.
یک ثابت صحیح همچنین میتوند دارای یک پسوند که ترکیبی از حرفU وL است، باشد.این پسوند میتواند باحرف بزرگ یا حرف کوچک باشد.
نمونه ای از ثابت های integer:
<span style="font-family: tahoma; font-size: 12px;">۲۱۲ /* Legal */</span>
<span style="font-family: tahoma; font-size: 12px;">۲۱۵u /* Legal */</span>
<span style="font-family: tahoma; font-size: 12px;">۰xFeeL /* Legal */</span>
<span style="font-family: tahoma; font-size: 12px;">۰۷۸ /* Illegal: 8 is not an octal digit */</span>
<span style="font-family: tahoma; font-size: 12px;">۰۳۲UU /* Illegal: cannot repeat a suffix */</span>
<span style="font-family: tahoma; font-size: 12px;">نمونه ای از انواع مختلف ثابت هایinteger</span>
<span style="font-family: tahoma; font-size: 12px;">۸۵ /* decimal */</span>
<span style="font-family: tahoma; font-size: 12px;">۰۲۱۳ /* octal */</span>
<span style="font-family: tahoma; font-size: 12px;">۰x4b /* hexadecimal */</span>
<span style="font-family: tahoma; font-size: 12px;">۳۰ /* int */</span>
<span style="font-family: tahoma; font-size: 12px;">۳۰u /* unsigned int */</span>
<span style="font-family: tahoma; font-size: 12px;">۳۰l /* long */</span>
۳۰ul /* unsigned long */

ثابت های اعشاری

ثابت اعشاری دارای یک قسمتinteger یک نقطه دهدهی یک قسمت تابعی و یک قسمت تعریف کننده است.

شما میتوانید نقاط اعشاری ثابت ها را در قالب فرم یا در قالب تعریفی نشان دهید زمان نمایش بوسله فرم دهدهی شما باید decimal point را انکلود کنید. زمانیکه از فرمexponential برای نشان دادن داده استفاده شود،شما باید قسمت صحیح ، قسمت کسری یا هردو را انکلود کنید. یک تعریف کننده امضا شده با حرف e یاE معرفی میشوند.

نمونه ای از مثال ها عبارتند از:

<span style="font-family: tahoma; font-size: 12px;">۳٫۱۴۱۵۹ /* Legal */</span>
<span style="font-family: tahoma; font-size: 12px;">۳۱۴۱۵۹E-5L /* Legal */</span>
<span style="font-family: tahoma; font-size: 12px;">۵۱۰E /* Illegal: incomplete exponent */</span>
<span style="font-family: tahoma; font-size: 12px;">۲۱۰f /* Illegal: no decimal or exponent */</span>
.e55 /* Illegal: missing integer or fraction */

دنباله خروج

کاراکتر های معینی در زبان Go وجوددارند زمانیکه با یک “\” نوشته میشوند معنی خاصی میابند که برای مثال کاراکتر (\n) برای خط جدید و (\t).برای تب زدن استفاده میشود لیست زیر دنباله های خروج را نشان میدهند.
ادامه…
مثال زیر نمونه ای از استفاده از این کاراکتر هاست:
package main
import "fmt"
<span style="font-family: tahoma; font-size: 12px;">func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("Hello\tWorld!")</span>
<span style="font-family: tahoma; font-size: 12px;">}</span>

خروجی کد بالا :

Hello World!

ثابت های رشته ای

ثابت های رشته ای که در (“”) قرار میگیرند،شامل کاراکتر هایی است که شبیه به کاراکتر های ثابت مثل:کاراکتر ساده،دنباله های خروج و کاراکتر های عمومی هستند.
شما میتوانید یک خط طولانی را به چند خط با استفاده از ثابت های رشته ای تبدیل کنید وآنها را با whitespace از هم جدا کنید.
نمونه ای از ثابت های رشته ای:

"hello, dear"
"hello, \
dear"
"hello, " "d" "ear"

کلمه کلید ی Const

شما میتوانید از پیشوند const برای تعریف ثابت ها بایک نوع مشخص استفاده کنید.
<span style="font-family: tahoma; font-size: 12px;">const variable type = value;</span>

مثال زیر با جزئیات بیشتر است.

 
package main
import "fmt"
<span style="font-family: tahoma; font-size: 12px;">func main() {</span>
<span style="font-family: tahoma; font-size: 12px;">const LENGTH int = 10</span>
<span style="font-family: tahoma; font-size: 12px;">const WIDTH int = 5</span>
<span style="font-family: tahoma; font-size: 12px;">var area int</span>
<span style="font-family: tahoma; font-size: 12px;">area = LENGTH * WIDTH</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Printf("value of area : %d", area)</span>
<span style="font-family: tahoma; font-size: 12px;">}</span>

زمانی که کد بالا اجرا شود نتیجه زیر بدست می آید.

value of area : 50

توجه داشته باشید یک تمرین خوب برای برنامه نویسی خوب تعریف ثابت ها باحروف بزرگ است.

توابع در Go

یک تابع ،گروهی از دستورات است که باهم یک کار را انجام میدهند هر برنامه تحتGoحداقل دارای یک تابع است این تابع همانmain() است هربرنامه میتواند توابع بیشتری اضافه کند.

شما میتوانید کدتان را به توابع جداگانه تقسیم کنید چگونگی این کار به شما بستگی داردولی ازلحاظ منطقی هر تابع باید یک کار انجام دهد.

تعریف تابع به کامپایلر نام تابع و پارامتر هایش را اطلاع میدهد معرفی تابع بدنه اصلی یک تابع را فراهم میکند.

کتابخانه زبان Go ،توابع داخلی بسیار زیادی دارد که میتوانید استفاده کنید،برای مثال تابع len() تعدادکاراکتر را برمی گرداند مثلا اندازه یک متغیر رشته ای را برمیگرداند یک تابع نامهای دیگری نیز دارند مثل:متد،یا procedure و..

تعریف یک تابع

فرم عمومی تعریف تابع در این زبان به این شکل است.

 
func function_name( [parameter list] ) [return_types]
{
   body of the function
}

تعریف تابع شامل شامل سربرگ وبدنه تابع میشود موارد زیر تمام قسمت های تابع است :

Func—تعریف تابع را شروع میکند.

Function Name—نام اصلی یک تابع است نام و پارامتر های تابع،یک تابع درست را تشکیل میدهند.

Parameters—پارامتر مثل یک جانگهدار است،زمانیکه تابع فراخوانی میشود شما یک مقدار به پارامتر میدهیداین مقدار به پارامتر یا آرگومان اصلی برمیگردد لیست پارامتر مربوط به نوع،ترتیب و تعداد پارامتر های یک تابع است پارامتر های اختیاری هستند یک تابع میتواند پارامتر نداشته باشد.

Return Type—یک تابع لیستی از مقادیر را بر میگرداند این لیست حاوی نوع داده مقادیر برگشتی تابع است بعضی از تابع خروجی یاهمان برگشتی را ندارند دراین مورد نوع برگشتی نیاز نیست.

Function Body— بدنه تابع شامل مجموعه ای از دستورات است که نوع کار تابع را تعیین میکند.

مثال:

مثال زیر سورس کد برای تابعی به نامMax است این تابع دو آرگومان میگیرد و بزرگترین شان را برمیگرداند.

 
/* function returning the max between two numbers */
func max(num1, num2 int) int
{
   /* local variable declaration */
   result int
 
   if (num1 > num2) {
     result = num1
   } else {
     result = num2
   }
   return result
}

فراخوانی تابع

زمان ساخت یک تابع در Go شما یک معرفی از کاری که تابع انجام میدهد را می دهید برای استفاده از تابع شما میتوانید تابع را برای اجرا فراخوانی کنید.

زمانیکه یک برنامه تابعی را فراخوانی میکند تابع آن وظیفه را انجام میدهد زمانیکه تابع دستوررا برمیگرداند یا تابع به پایان می رسد control back برنامه را به برنامه اصلی برمیگرداند.

برای فراخوانی یک تابع شما نیاز به دادن پارامتر های مورد نیاز تابع دارید وتابع یک مقدار را برمیگرداند که میتوانید آنرا ذخیره کنید.

برای مثال:

 
package main
 
import "fmt"
 
func main() {
   /* local variable definition */
   var a int = 100
   var b int = 200
   var ret int
 
   /* calling a function to get max value */
   ret = max(a, b)
 
   fmt.Printf( "Max value is : %d\n", ret )
}
 
/* function returning the max between two numbers */
func max(num1, num2 int) int {
   /* local variable declaration */
   var result int
 
   if (num1 > num2) {
     result = num1
   } else {
     result = num2
   }
   return result
}

زمانیکه تابع اجرا شود، نتیجه زیر ایجاد میشود.

Max value is : 200

برگرداندن چند مقدار توسط تابع

یک تابع میتواند چند مقدار برگرداند مثل:

 
package main
 
import "fmt"
 
func swap(x, y string) (string, string) {
   return y, x
}
 
func main() {
   a, b := swap("Mahesh", "Kumar")
   fmt.Println(a, b)
}

خروجی کدبالا:

Kumar Mahesh

آرگومان های تابع

اگر یک تابع باید از آرگومان استفاده کند،باید مقدار های آرگومان هاراقبول کند این متغیر ها formal parameters نامیده میشوند.

این متغیر ها مثل بقیه متغیر های محلی رفتار میکنند که در ابتدای تابع تعریف و درآخر تابع ازبین میروند.

زمان فراخوانی یک تابع دو راه برای دادن آرگومان به تابع وجود دارد.

بطور پیش فرض از مقدار call by برای دادن آرگومان ها استفاده میکند.

عموما به این معنی است که کد داخل تابع که برای فراخوانی استفاده شده دیگر قابل تغییر نیست مثل مثال تابعMax

استفاده از تابع

بازگشت (Recursion) در Go

Recursion پروسه تکرار آیتم ها با یک روش ویژه است..مثل زبان های برنامه نویسی دیگر که به شما اجازه فراخوانی یک تابع داخل همان تابع را میدهد که recursive نامیده میشود.

 
func recursion() {
recursion() /* function calls itself */
}
 
func main() {
recursion()
}

زبان برنامه نویسی Go این بازگشت را پشتیبانی میکند به این معنی که تابع خودش فراخوانی میشود.امازمان استفاده از بازگشت، برنامه نویس باید در تعریف شرط خروج تابع مراقب باشددر غیر این صورت حلقه بی نهایت خواهد شد.

تابع بازگشت برای حل مسائل ریاضی بسیار پرکاربرد است برای مثال فاکتوریل یک عدد تولید سری فیبوناچی و… .

فاکتوریل عدد

مورد زیر یک مثال است که فاکنویل یک عدد رابا استفاده از این تابع نشان میدهد.

 
package main
 
import "fmt"
 
func factorial(i int) {
if(i <= 1) {
return 1
}
return i * factorial(i - 1)
}
 
func main() {
var i int = 15
fmt.Printf("Factorial of %d is %d\n", i, factorial(i))
}

خروجی کدبالا:

Factorial of 15 is 2004310016

سری فیبوناچی

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

package main
 
import "fmt"
 
func fibonaci(i int) {
if(i == 0) {
return 0
}
if(i == 1) {
return 1
}
return fibonaci(i-1) + fibonaci(i-2)
}
 
func main() {
var i int
for i = 0; i < 10; i++ {
fmt.Printf("%d\t%n", fibonaci(i))
}
}

خروجی کدبالا:

۰ ۱ ۱ ۲ ۳ ۵ ۸ ۱۳ ۲۱ ۳۴

انواع داده GO

در زبان Go نوع داده ها به سیستم وسیعی که برای مقدار دهی متغیر ها یا توابع به کار میرود مربوط میشود.نوع یک متغیر معلوم میکند که چقدر حافظه را اشغال شود والگوی آن چگونه کامپایل شود.

 

انواع متغیر ها در این زبان عبارتند از:

توابع آرایه ای و ساختاری به انواع مجموعه ای مربوط هستندو نوع یک تابع مجموعه تمام توابع را با همان پارامتر های آن را تعیین میکند.ما انواع داده پایه را در بخش زیر میبینیم بقیه آنها در قسمت های بعد پرداخته خواهدشد.

نوع داده های صحیح

نوع داده های صحیح از پیش تعریف شده عبارتند از:
انواع داده های عددی دیگرهمچنین یک مجموعه از نوع داده عددی با سایز های مخصوص طراحی شده اند.

اشاره گر ها(Pointers)در Go

استفاده از اشاره گر ها ساده وراحت است بعضی وظایف برنامه نویسی زبان Goبا pointerراحتتر انجام میشود بقیه وظایف مثل فراخوانی از منبع بدون اشاره گر قابل انجام نیست.پس برای تبدیل شدن به برنامه نویس خوب زبانGoلازم است که این مبحث را خوب یاد بگیرید بریم آموزش را شروع کنیم.

همانطور که میدانید هر متغیر یک مکان در حافظه است وهر مکانی نیز آدرس خودرا داردکه میتوان بااستفاده از عملگر(&) میتوان به آن دسترسی پیداکردمثال زیر آدرس متغیر تعریف شده را نشان میدهد.

 
package main
 
import "fmt"
 
func main() {
var a int = 10
 
fmt.Printf("Address of a variable: %x\n", &a )
}

خروجی کدبالا :

Address of a variable: 10328000

خوب شما چگونگی دسترسی به حافظه را فهمیدید پایه کارهمین بود بریم سراغ بعدی.

اشاره گر چیست؟

یک اشاره گر متغیری است که آدرس متغیر دیگر را نگه می دارد قالب اصلی تعریف یک متغیر pointer مانند زیر است.

var var_name *var-type

قالب،نوع اصلی یک اشاره گر است که باید یک نوع داده معتبر زبان سی باشد var-name نام متغیر اشاره گر است علامت ستاره ای در تعریف متغیر استفاده کردیم برای تعریف متغیر نیاز است.

در این دستورعلامت ستاره برای طراحی متغیر استفاده شده است.

مثال زیر یک تعریف متغیر معتبر است.

 
var ip *int /* pointer to an integer */
var fp *float32 /* pointer to a float */

نوع اصلی داده تمام pointer ها integer,float,…میتواند باشد.

یک عدد هگزادسیمال بزرگ آدرس حافظه رانشان می دهد.تنها تفاوت بین pointerبا بانوع داده های دیگر،نوع داده ای که pointerاستفاده میکند،است.

چگونه از این اشاره گر استفاده کنیم؟

چند عملیات مهم وجود دارد که مامیتوانیم به کمک اشاره گر هامکررا انجام دهیم.

    1. ما یک متغیر اشاره گر تعریف میکنیم
    2. آدرس یک متغیر را به آن می دهیم
    3. بالاخره دسترسی به مقدار آدرس موجود در متغیرpointer.

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

 
package main
 
import "fmt"
 
func main() {
var a int= 20 /* actual variable declaration */
var ip *int /* pointer variable declaration */
 
ip = &a /* store address of a in pointer variable*/
 
fmt.Printf("Address of a variable: %x\n", &a )
 
/* address stored in pointer variable */
fmt.Printf("Address stored in ip variable: %x\n", ip )
 
/* access the value using the pointer */
fmt.Printf("Value of *ip variable: %d\n", *ip )
}

نتیجه کدبالا:

 
Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

اشاره گر هایnil

کامپایلرgo یک مقدارNil به اشاره گر میدهد زمانیکه آدرس دقیقی ثبت مشده باشداشاره گری که مقدار خالی به آن نسبت داده شود nil pointer نامیده میشود.

nil pointer یک ثابت با مقدار صفر است که در کتابخانه های زیادی معرفی شده است مانند برنامه زیر:

 
package main
 
import "fmt"
 
func main() {
var ptr *int
 
fmt.Printf("The value of ptr is : %x\n", ptr )
}

خروجی بالا:

The value of ptr is 0

در بیشتر سیستم عامل ها برنامه ها اجازه دسترسی به آدرس صفر ندارند زیرا بوسیله خودسیستم عامل رزرو شده است هرچند عدد صفر اهمیت داردامابه این معنی است که اشاره گر قصد دسترسی به آدرس حافظه ندارد اگر اشاره گر صفر باشد یعنی به چیزی دسترسی ندارد.

 
if(ptr != nil) /* succeeds if p is not nil */
if(ptr == nil) /* succeeds if p is null */

جزئیات اشاره گر ها در زبانGO

آرایه ها درGo

زبان Go یک ساختار داده به نام Array فراهم میکند که میتواند یک مجموعه با تعداد عناصر ثابت و یک نوع ذخیره کند.آرایه برای ذخیره مجموعه داده استفاده میشود.

بجای تعریف متغیر های مستقل میتوانید یک آرایه متغیر مثل numbers ایجاد کنید تا متغیر های مستقل را نشان دهید یک عنصر خاص بوسیله ایندکس دستیابی میشود.

تمام آرایه ها حاوی مکان های متصل به هم در حافظه هستندپایین ترین آدرس مربوط به اولین عنصر وبالاترین آدرس مربوط به آخرین عنصر آرایه است.

تعریف ارایه

برای تعریف آرایه، یک برنامه نویس نوع و تعداد عناصر آرایه را تعین میکند.

var variable_name [SIZE] variable_type

به این آرایه یک بعدی می گویند. arraySize باید یک ثابت integer بزرگتر ازصفر باشد ونوع آن نیز باید معتبر باشد برای مثال جهت تعریف یک آرایه ۱۰ عنصری که balance نامیده میشود از این دستور استفاده کنید.

var balance [10] float32

مقداردهی اولیه آرایه ها

شما میتوانید آرایه یکی یکی یا با یک دستور مقداردهی کنید.

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

تعداد بین ” { } “نمی تواند بزرگتر از تعداد عناصری که تعیین کرده ایم باشد.

اگر شما اندازه آرایه را تعیین نکنید،یک آرایه به اندازه عناصر وارد شده ایجاد میشود مثل:

var balance = []float32{1000.0, 2.0, 3.4, 7.0, 50.0}

مثال زیر مقداردهی یک آرایه را به تنهایی نشان می دهد.

balance[4] = 50.0

دستور بالاعدد ۵۰ را به عنصر پنجم آرایه نسبت میدهد ایندکس تمام آرایه ها از عدد صفر شروع میشود و آخرین ایندکس، یک شماره از اندازه آرایه کمتر است. تصویر زیر همان آرایه ای که دربالا تعریف کردیم را نشان میدهد.

دسترسی به عناصر آرایه

یک عنصر آرایه با ایندکس کردن نام آرایه دستیابی میشود این دستیابی با قراردادن ایندکس در ” []” انجام میشود برای مثال:

float32 salary = balance[9]

دستور بالا دهمین عنصر آرایه رابه متغیر salary نسبت میدهد مثال زیر مجموعه ای از توضیحاتی که بالا دادیم را در برمیگیرد.

 
package main
import "fmt"
func main() {
var n [10]int /* n is an array of 10 integers */
var i,j int
 
/* initialize elements of array n to 0 */
for i = 0; i < 10; i++ {
n[i] = i + 100 /* set element at location i to i + 100 */
}
 
/* output each array element's value */
for j = 0; j < 10; j++ {
fmt.Printf("Element[%d] = %d\n", j, n[j] )
}
}

خروجی کدبالا:

 
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

جزئیات آرایه ها در زبانGo

 

Scope Rules در Go

 

یکscope در هر زبان برنامه نویسی فضایی از هر برنامه است که متغیر تعریف شده فقط میتواند درآن وجود داشته باشد وبیشتر ازاین ممکن نیست دومکان وجوددارد که متغیر ها میتوانند در زبان سی تعریف شوند.
    1. داخل یک تابع یا یک بلوک که متغیر های محلی نامیده میشوند.
    2. خارج از تابع که متغیر سراسری نامیده میشوند.
    3. درزمان تعریف پارامتر های تابع که پارامتر های formal نامیده میشوند.
بگذارید که این متغیر هاراتوضیح دهیم.

متغیر های محلی

متغیر هایی که داخل تابع یابلوک تعریف شده اند متغیر محلی اند. که میتوانند فقط با دستوراتی که داخل تابع یا بلوک است ،کار کنند و دربیرون تابع قابل استفاده نیستند مثال زیر استفاده از این متغیر هاست.

package main
import "fmt"
func main() {
/* local variable declaration */
var a, b, c int
/* actual initialization */
a = 10
b = 20
c = a + b
fmt.Printf ("value of a = %d, b = %d and c = %d\n", a, b, c)
}

خروجی کد بالا:

value of a = 10, b = 20 and c = 30

متغیر های سراسریاین متغیر ها داخل تابع تعریف میشوند و معمولا در ابتدای برنامه و مقدار آنها در کل برنامه قابل استفاده و تغییر است .

مثال زیر استفاده از این متغیر هاست.

package main
import "fmt"
 
/* global variable declaration */
var g int
 
func main() {
/* local variable declaration */
 var a, b int
/* actual initialization */
 a = 10
 b = 20
 g = a + b
fmt.Printf("value of a = %d, b = %d and g = %d\n", a, b, g)
}

خروجی کد بالا:

value of a = 10, b = 20 and c = 30

یک برنامه میتواند دارای دومتغیر محلی و سراسری با یک اسم باشد اما مقدار متغیر محلی اولویت دارد .

مانند مثال زیر:
package main
import "fmt"
 
/* global variable declaration */
var g int = 20
 
func main() {
 /* local variable declaration */
 var g int = 10
 
 fmt.Printf ("value of g = %d\n", g)
}

خروجی کد بالا:

value of g = 10

پارامترهای formal

با پارامتر های تابعی و فرمال بعنوان یک متغیر محلی رفتار میشود اما برمتغیر های سراسری اولویت دارد .

مانند مثال زیر:

package main
import "fmt"
 
/* global variable declaration */
var a int = 20;
 
func main() {
 /* local variable declaration in main function */
 var a int = 10
 var b int = 20
 var c int = 0
fmt.Printf("value of a in main() = %d\n", a);
 c = sum( a, b);
 fmt.Printf("value of c in main() = %d\n", c);
}
/* function to add two integers */
func sum(a, b int) int {
 fmt.Printf("value of a in sum() = %d\n", a);
 fmt.Printf("value of b in sum() = %d\n", b);
return a + b;
}

خروجی کد بالا:

value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30

مقداردهی اولیه متغیر های محلی و سراسری

زمانیکه یک متغیر محلی مانند متغیر سراسری به مقدار ۰ خود مقدار دهی میشوند ،Pointer یاهمان اشاره گر بامقدارnil مقدار دهی میشود.

قطعات(Slices) درGo

Slice در زبانgo یک برداشت از آرایه هاست همانطور که زبانGo به شما اجازه تعریف انواع متغیرها که میتوانند داده ها زیادی نگه دارند،را میدهد،اما هیچ متد داخلی برای افزایش سایز به صورت داینامیک یا ساخت زیر آرایه ندارداما Slice ها این محدودیت را ازبین می برند.و تابع های زیادی برای آرایه ها فراهم میکنند ودر Goبسیار کاربرد دارند.

تعریف یکSlice

برای تعریف یکSlice میتوانید آن را به عنوان یک آرایه بدون تعیین سایز تعریف کنید.

 
var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/

توابعlen() وcap()

Slice یک نوع مفهوم وبرداشت از آرایه است.دراصل از آرایه و زیرمجموعه تابعstructure.len() استفاده میکند و تعداد عناصر داخل Slice را برمیگردانددرحالیکه تابع cap() ظرفیت یک slice را برمیگرداند مقال زیر استفاده از این slice است.

 
package main
 
import "fmt"
 
func main() {
var numbers = make([]int,3,5)
printSlice(numbers)
}
 
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

خروجی کدبالا:

len=3 cap=5 slice=[0 0 0]Nil slice

اگر یک slice بدون ورودی تعریف شود،بعنوان یک slice بدون مقدار در نظر گرفته میشود وظرفیت آن صفر میشود.

 
package main
 
import "fmt"
 
func main() {
var numbers []int
printSlice(numbers)
if(numbers == nil){
fmt.Printf("slice is nil")
}
}
 
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

خروجی کدبالا:

 
len=0 cap=0 slice=[]slice is nil

sub-slicing

Slice اجازه استفاده از زیر مجموعه(subslice) را نیز میدهد مثال زیر نمونه ای از این استفاده است.

 
package main
 
import "fmt"
 
func main() {
/* create a slice */
numbers := []int{0,1,2,3,4,5,6,7,8}
printSlice(numbers)
/* print the original slice */
fmt.Println("numbers ==", numbers)
/* print the sub slice starting from index 1(included) to index 4(excluded)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
/* missing lower bound implies 0*/
fmt.Println("numbers[:3] ==", numbers[:3])
/* missing upper bound implies len(s)*/
fmt.Println("numbers[4:] ==", numbers[4:])
numbers1 := make([]int,0,5)
printSlice(numbers1)
/* print the sub slice starting from index 0(included) to index 2(excluded) */
number2 := numbers[:2]
printSlice(number2)
/* print the sub slice starting from index 2(included) to index 5(excluded) */
number3 := numbers[2:5]
printSlice(number3)
}
 
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

خروجی کدبالا:

 
len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]numbers == [0 1 2 3 4 5 6 7 8]numbers[1:4] == [1 2 3]numbers[:3] == [0 1 2]numbers[4:] == [4 5 6 7 8]len=0 cap=5 slice=[]len=2 cap=9 slice=[0 1]len=3 cap=7 slice=[2 3 4]

 

توابع append() و copy()

Slice به شما اجازه افزایش ظرفیت را بااستفاده از تابع append() می دهد.بااستفاده از تابع copy() محتوای Slice به Slice مقصد کپی میشود مثال:

 
package main
 
import "fmt"
 
func main() {
var numbers []int
printSlice(numbers)
/* append allows nil slice */
numbers = append(numbers, 0)
printSlice(numbers)
/* add one element to slice*/
numbers = append(numbers, 1)
printSlice(numbers)
/* add more than one element at a time*/
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* create a slice numbers1 with double the capacity of earlier slice*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* copy content of numbers to numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
 
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

خروجی کدبالا:

len=0 cap=0 slice=[]len=1 cap=2 slice=[0]len=2 cap=2 slice=[0 1]len=5 cap=8 slice=[0 1 2 3 4]len=5 cap=16 slice=[0 1 2 3 4]

قواعد اصلی GO

قالب پایه نوشتن کد

شما یک ساختار ساده از یک برنامهGO را دیدید پس کار شما در فهم مفاهیم دیگر این زبان برنامه نویسی راحت شده است.

نشانه ها در زبانGo

یک برنامه Goاز نشانه های مختلفی تشکیل شده است Tokenیک کلمه کلیدی،یک شناسایی کننده،یک رشته حرفی یا یک سمبل است. برای مثال دستورات زیر شامل شش نشانه است.
نشانه های مستقل عبارتند از:
<span style="font-family: tahoma; font-size: 12px;">fmt</span>
<span style="font-family: tahoma; font-size: 12px;">.</span>
<span style="font-family: tahoma; font-size: 12px;">Println</span>
<span style="font-family: tahoma; font-size: 12px;">(</span>
<span style="font-family: tahoma; font-size: 12px;">"Hello, World!"</span>
<span style="font-family: tahoma; font-size: 12px;">)</span>

جداکننده خط

در برنامه تحت Go جداکننده خط یک دستور به پایان رسانننده است یعنی هر دستور مستقل یک جداکننده ویژه مثل”;” نیاز ندارد کامپایلر Go بطور خودکار یک تمام کننده دستورات “;” برای نشان دادن یک موجودیت منطقی قرار میدهد.
برای مثال کدهای زیر دو دستور متفاوت هستند.
<span style="font-family: tahoma; font-size: 12px;">fmt.Println("Hello, World!")</span>
<span style="font-family: tahoma; font-size: 12px;">fmt.Println("I am in Go Programming World!")</span>

کامنت ها

کامنت ها یا توضیحات به شما در خواندن راحتتر کد کمک میکند ولی بوسیله کامپایلر در نظر گرفته نمیشود با کاراکتر/* شروع وبا*/ پایان می یابد مثل:

/* my first program in Go */

شما نمیتوانید کامنتت هایی داخل یک کامنت قراردهید.

شناساگر ها

شناساگر Go یک نام است که برای شناسایی یک متغیر،تابع یا هر ایتم تعریف شده توسط کاربر به کار میرود.یک شناساگر با حرف AتاZبزرگ یا کوچک یا حتی یک زیر خط( _ )شروع میشودکه با صفر یا حرف های دیگر،زیر خط ها یا ارقام ۰ تا ۹ دنبال میشود.

این زبان به شما اجازه استفاده از کاراکتر های ویژه مثل @, $, % در داخل یک شناساگر نمیدهد.
Go به حروف کوچک وبزرگ حساس است .موارد زیر نمونه ای از شناساگر ها قابل قبول در Goهستند.

<span style="font-family: tahoma; font-size: 12px;">mahesh kumar abc move_name a_123</span>
myname50 _temp j a23b9 retVal

کلمات کلیدی

لیست زیر کلمه های رزرو شده در Go را نشان میدهد این کلمات کلیدی نمیتوانند بعنوان متغیر یا ثابت استفاده شوند.
<span style="font-family: tahoma; font-size: 12px;">break default func interface select</span>
<span style="font-family: tahoma; font-size: 12px;">case defer go map struct</span>
<span style="font-family: tahoma; font-size: 12px;">chan else goto package switch</span>
<span style="font-family: tahoma; font-size: 12px;">const fallthrough if range type</span>
<span style="font-family: tahoma; font-size: 12px;">continue for import return var</span>

فضاهای سفید(whitespace) در Go

یک خط شامل فضای سفید مثل یک کامنت بعنوان خط خالی در نظر گرفته میشود و کامپایلر آن را در نظر نمیگیرد.
Whitespace یک اصطلاح برای توضیح خط های خالی،تب ها،خط جدید و کامنت ها است این فضاهای سفید یک قسمت از دستورات را از قسمت های دیگر جدامیکندو کامپایلر را قادر به شناسایی یک عنصر در دستورات میکند مثل متغیر نوعInt تمام میشود و عنصر بعدی شروع میشود مانند دستور زیر:
<span style="font-family: tahoma; font-size: 12px;">var age int;</span>

حداقل باید یک کاراکترwhitespace معمولا همان فاصله بین ageو int وجود داشته باشد تا کامپایلر قادر به تمایز و تشخیص آنها باشد یک مثال دیگر:

<span style="font-family: tahoma; font-size: 12px;">fruit = apples + oranges; // get the total fruit</span>

هیچ کاراکترwhitespace بین fruit و= یا بین = وapples لازم نیست اگر چه میتوانید برای خواناتر شدن کدتان میتوانید بگذارید.

اگر در حال حاضر فرصت مطالعه این مقاله را ندارید، می توانید فایل PDF آن را دریافت کنید

related blogs

مقالات مرتبط

همیشه در کنار شما هستیم

برای توسعه کسب و کارتان ، تا انتها در کنار شما هستیم . بدون نگرانی به فکر پیشرفت باشید.

همیشه در کنار شما هستیم

برای توسعه کسب و کارتان ، تا انتها در کنار شما هستیم . بدون نگرانی به فکر پیشرفت باشید.

آکادمی ایراکد

مشاوره فنی و تخصصی رایگان

جهت دریافت خدمات مشاوره و یا سفارش طراحی سایت و اپلیکیشن، سئو و سایر خدمات شرکت فرم زیر را تکمیل نمایید.مشتاقانه پاسخگوی شما خواهیم بود

Comments

دیدگاه ها و سوالات شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

فرم ثبت سفارش

Registration Form