زبان برنامه نویسی GO به دلیل نوشتار ساده بین برنامه نویسان محبوب است. در این مقاله با آموزش برنامه نویسی go به زبانی ساده همراه شما هستیم .
زبان Goیک زبان برنامه نویسی است که در سال ۲۰۰۷ توسط گوگل توسعه یافته شد. که بسیار شبیه زبانcاست .
همچنین قابلیت تایپ امن وپویارا دارد تمام اشیا داخل این زبان مثل آرایه اندازه متغیرها و نقشه های کلیدی وهمچنین یک کتابخانه خوب و استانداردی فراهم کرده است.
این زبان در نوامبر سال ۲۰۰۹ میلادی معرفی و در برخی تولیدات گوگل استفاده شد.
این آموزش برای آشنایی کامل شما بااین زبان از صفرتاصد طراحی شده است.این آموزش به شما درک کافی برای ساخت برنامه با اینه زبان را میدهد.
قبل از شروع این آموزش باید درک ابتدایی از اصطلاحات برنامه نویس داشته باشید این درک به شما در یادگیری سریع و آسان این زبان کمک خواهد کرد.
کد زیر نمونه ای از برنامه نویسی Go است.
package main import "fmt" func main() { fmt.Println("Hello, World!") }
شما نیاز به نصب محیط برنامه نویسی ندارید دلیلش ساده است،زیرا ما برای شما یک محیط برنامه نویسی انلاین طراحی کرده ایم.
وشما به آسانی میتوانید برنامه خودرا کامپایل واجرا کنید این اپشن به شما در حال تایپ احساس اعتماد به نفس می دهد.
این مثال زیر را با اپشنی که در زیر وجود داردتست کنید.
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” می باشد.
قبل از شروع کد نویسی مطمئن شوید که ویرایش گر در پوشه مورد نظر باشد وتجربه کافی در کد نویسی داشته باشد و در یک فایل ذخیره و اجرا کنید.
کد منبعی که در در فایل سورس نوشته شده زبان سطح بالاست که باید به زبان ماشین ترجمه شود کامپایلر این زبان برای ترجمه سورس کد استفاده میشود.
در این آموزش فرض میکنیم که شما یک دانش ابتدایی در برنامه نویسی دارید.این زبان برای لینوکس ورژن ۸ به بالا و سیستم عامل مک و ویندوز ۳۲ و ۶۴ بیت عرضه شده
است بخش زیر به شما در نصب این زبان کمک میکند.
آخرین ورژن پکیج این زبان را ازسایت 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 نوع داده های نقشه ی مهمی که کلید های منحصر به فرد رابه مقادیر می دهد. کلید یک شی است که شما برای بازیابی یک مقداردر یک تاریخ دیگر استفاده میکنید،کلید ومقدارداده شده.شما میتوانید مقدار رادر یک شی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 یک فریم ورک مدیریت خطای ساده با رابط کاربری داخلی فراهم کرده است.
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 یک نوع خاص داردکه سایز و چیدمان متغیر در حافظه ،محدوده مقدارها که میتوانند داخل حافظه ذخیره شوندو همچنین عملیاتی که میتواند به متغیر اعمال شوند را مشخص میکند.
نام یک متغیر میتواند شامل حروف،اعداد و کاراکتر زیر خط باشد.ومیتواند با یک حرف یا یک زیر خط شروع شود . همچنین این زبان به حروف کوچک وبزرگ حساس است
همچنین این زبان به ما اجازه تعریف انواع دیگر متغیر ها را می دهدکه در بخش های بعدی به آنها خواهیم رسید.
منظور از تعریف متغیر این است که کامپایلر بگوییم که چقدر حافظه را اشغال کند.
<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 وجوددارد:
متغیر ها lvalue هستند که در قسمت چپ یک تعریف قرار میگرند اعداد دقیق rvalue هایی هستند که مقداری به آن نسبت داده نمیشود ودر قسمت چپ نیز نمایش داده نمیشود مثال زیر یک دستور معتبر است.
x = 20.0
امامثال زیر یک دستور معتبر نیست خطای کامپایل میدهد.
۱۰ = ۲۰
عملگر یک نشانه است که به کامپایلر میگوید که یک کار ریاضی یا دستکاری منطقی انجام دهد.
زبان Go دارای عملگر های داخلی زیادی است ازجمله:
این آموزش همه این عملگرهارا توضیح خواهد داد.
جدول زیر تمام عملگر های حسابی که بااین زبان پشتبانی می شود را نشان میدهد ؛ فرض کنیدحرفA” 10 “و حرفB” 20 “رانگه می دارد.
جدول زیر تمام عملگر های رابطه ای که بااین زبان پشتبانی می شود را نشان میدهدفرض کنیدحرفA” ۱۰ “و حرفB” ۲۰ رانگه می دارد.
جدول زیر تمام عملگر های رابطه ای که بااین زبان پشتبانی می شود را نشان میدهدفرض کنیدحرفA مقدار ۱ و حرفB 0رانگه می دارد.
این عملگر هابرروی بیت ها کار میکنند وجدول واقعی برای&,|,^ جدول زیر است.
فرض کنید اگر 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 و? : بااین زیان پشتیبانی میشود:
اولویت عملگر ها گروه های یک عبارت را تعیین میکند .این کار نشان میدهد که چگونه یک عبارت ارزیابی میشود بعضی عملگر ها اولویت بالاتری نسبت به بقیه دارند.برای مثال عملگر ضرب اولویتش از جمع بیشتر است برای مثال حاصلx = 7 + 3 * 2 عدد۱۳ است نه عدد۲۰ بخاطر اینکه اول عملگر ضرب انجام میشود و بعد عملگر جمع دراین جدول عملگر ها براساس اولویت نوشته شده اند و اولویت بالاتر اول اجرا میشود.
ادامه…
آرایه های زبانGo به شما در معرفی انواع متغیر هایی که میتواند چندین ایتم داده را مثل هم نگه دارداما ساختار(structure) یک نوع داده تعریف شده در زبانGoاست که میتواند داده هایی که از انواع مختلف هستندرا نگه دارد.
Structures برای نشان دادن یک رک.رد به کار میروند مثلا اگر شما بخواهید مسیر کتابتان در کتابخانه را نگه دارید بایداین صفات را دنبال کنید.
برای تعریف یک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 باید از عملگر 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 بعنوان یک آرگومان استفاده کنید مثل وقتی که یک متغیر یا 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 ها تعریف کنیدمثل بقیه متغیر ها
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 شامل قسمت های زیر است.
• تعریف پکیج
• وارد کردن پکیج
• توابع
• متغیر ها
• دستورانت و اصطلاحات
• کامنت ها
مثال زیر یک کد ساده در زبان 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!") }
بیایید یک نگاه به قسمت های برنامه بالا بیندازیم.
بگذارید ببینیم که چگونه سورس کد خودرا در یک فایل ذخیره ،کامپایل و اجراکنیم.مراحل آن به این صورت است.
<span style="font-family: tahoma; font-size: 12px;">$ go run hello.go</span> Hello, World!
مطمئن شوید که کامپایلر در مسیر شما تعریف شده باشد وفرمان را در پوشه ای که حاوی فایل تان باشد اجراکنید.
ساختار گرفتن تصمیم به این شکل است که برنامه نویس باید یک یا چند شرط رابرای ارزیابی توسط برنامه مشخص کند.
زمانیکه دستورات اجرا شود اگر شرط درست باشد دستورات اجرا خواهد شد اگر شرط غلط باشد اتفاقی نمی افتد.
تصویر زیر یک فرم کلی از تصمیم گیری ساده است که در بیشتر زبان های برنامه نویسی وجود دارد.
زبان Go انواع دستورات تصمیم گیری زیر را فراهم میکند.
/* 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
زمانی شما می خواهید یک بلوک از کد را چندبار تکرار کنید.بطور کلی دستورات بطور مرحله ای اجرا میشوند:دستور اول یک تابع است که ابتدا اجرا میشود بعد دوم وبعد غیره.
زبان های برنامه نویسی کنترل زیادی برای مسیر های پیچیده اجرا،فراهم میکنند.
دستور حلقه به ما در اجرای یک دستور یا گروهی از دستورات بطور چند بار پشت سرهم کمک میکند شکل زیر نمونه ای از یک دستور حلقه در زبان های برنامه نویسی است.
این زبان انواع حلقه های زیر را پشتیبانی میکند.
این دستورات اجرای دستورات آن را از مراحل نرمال خود تغییر میدهد زمانیکه اجرایک مقدار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 یک حلقه بی نهایت را متوقف کنید.
<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 */
شما میتوانید نقاط اعشاری ثابت ها را در قالب فرم یا در قالب تعریفی نشان دهید زمان نمایش بوسله فرم دهدهی شما باید 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 */
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!
"hello, dear" "hello, \ dear" "hello, " "d" "ear"
<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حداقل دارای یک تابع است این تابع همان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 پروسه تکرار آیتم ها با یک روش ویژه است..مثل زبان های برنامه نویسی دیگر که به شما اجازه فراخوانی یک تابع داخل همان تابع را میدهد که 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با 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استفاده میکند،است.
چگونه از این اشاره گر استفاده کنیم؟
چند عملیات مهم وجود دارد که مامیتوانیم به کمک اشاره گر هامکررا انجام دهیم.
این کاربااستفاده از عملگر(*)انجام میشود و مقدارمتغیری که در آدرس مشخص شده وجودداردرا برمی گرداند مثال زیر استفاده از این متغیر است.
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
کامپایلر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 یک ساختار داده به نام 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
متغیر هایی که داخل تابع یابلوک تعریف شده اند متغیر محلی اند. که میتوانند فقط با دستوراتی که داخل تابع یا بلوک است ،کار کنند و دربیرون تابع قابل استفاده نیستند مثال زیر استفاده از این متغیر هاست.
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
مانند مثال زیر:
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
Slice در زبانgo یک برداشت از آرایه هاست همانطور که زبانGo به شما اجازه تعریف انواع متغیرها که میتوانند داده ها زیادی نگه دارند،را میدهد،اما هیچ متد داخلی برای افزایش سایز به صورت داینامیک یا ساخت زیر آرایه ندارداما Slice ها این محدودیت را ازبین می برند.و تابع های زیادی برای آرایه ها فراهم میکنند ودر Goبسیار کاربرد دارند.
برای تعریف یک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*/
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
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]
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]
<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>
<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
<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>
<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
جای شما در میان برندهایی که به ما اعتماد کردند، خالیست
Our Customers
Registration Form
آدرس دفتر مرکزی:
تهران ، جردن ، خیابان تابان غربی ، برج نور ، طبقه ۱
تهران ، میرداماد ، تقاطع نور و تابان غربی ، برج اداری تجاری نور ، طبقه ۱
فروش :
پشتیبانی :
همراه :
تمامی حقوق این وبسایت متعلق به شرکت ایراکد می باشد
Registration Form