68
سی برنامه نوی معرفی زبانGo golang.org - رضا قادری امیر آبان۱۳۹۱ نسخه1.1 [email protected] سی برنامه نوی معرفی زبانGo رضا قادری امیر

go language

Embed Size (px)

DESCRIPTION

go programming

Citation preview

Page 1: go language

Goمعرفی زبان برنامه نویسی golang.org

۱۳۹۱ آبانامیررضا قادری - 1.1نسخه

[email protected]

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 2: go language

گ‌کگذاری این سند با حفظ نام نویسنده آزاد است. نه تنها آزاد است، بلکه توصیه نیز می گردد! باز پخش یا به اشترا

خوشحال می شوم که اگر اشکالی در این مطلب پیدا کردید (املیی، معنایی، مفهومی، …) و یا اگر توصیه ایی برای بهتر شدن نگارش آن دارید، آنرا از طریقایمیل با من در میان بگذارید.

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

گ‌هی گ‌یتوانید از آدرس زیر دانلود کنید:۱.۰نسخ این سند را مhttps://www.dropbox.com/s/rntxj5dyqlui6ff/golang-persian-intro.zip

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 3: go language

توضیح درباره متن نوشته:

گ‌یباشند.با اینکه تمام سعی بر این بوده که مطالب به صورت ساده بیان شود، اما گ‌هنویسان با تجربه م مخاطبان اصلی این نوشته برنام

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

گ‌هی وئه شده است، ایک «اسلید» به شما اردر قالب نوشته خوان خود را طوری تنظیم کنیدPDF خواندن آن وقت زیادی از شما نخواهد گرفت. (بهتر است برنام نمایش دهد.)Fullscreenکه این نوشته را در حالت

گ‌ههای موجود در همچنین، زبان فارسی که براستی شکر است، گزینه ی خیلی مناسبی برای استفاده در علوم کامپیوتری نیست! معنی فارسی بسیاری از واژگ‌ب فارسی موجود در این گ‌هاش هم کت گ‌یکند و جز سردرگمی برای خواننده چیز دیگری به همراه ندارد. نمون مباحث کامپیوتری، درک درستی از آن واژه ارایه نمگ‌هها گ‌نها آگاهند. البته مشکل از زبان فارسی نیست، مساله این است که خیلی از این واژ ب ًل به شبهات موجود در آ زمینه است که متخصصان علوم کامپیوتر کام

ب ًل سردرگم می شود، چرا کهاگرحتی در زبان انگلیسی هم معنی مخصوص به خودشان را ندارند! یک شهروند انگلیسی هم متون تخصصی کامپیوتر را بخواند کامگ‌نها بسیار متفاوت است.(نمونه اش نام همین زبان برنامه نویسی : گ‌هها در این متون با کاربرد معمول آ ) به همین خاطر در این نوشته سعی شده تاGoمعنی واژ

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

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 4: go language

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 5: go language

گ‌ههای موجود بسیاری من« گ‌هها خوشم میادهمه ی این زبان رو دوست دارم. در واقع، بهتره بگم از در از اید » این اید

Martin Odersky ) javac و سازنده ی نسل فعلی کامپایلر جاوا ( Scalaخالق زبان برنامه نویسی

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 6: go language

package main

import "fmt"

func main() { fmt.Printf("Hello, World! \n")

}

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 7: go language

تاریخچه ای کوتاه

گ‌مافزارکهRob Pike و Ken Thompson، 2007در سپتامبر سال گ‌ههای دنیای نر گ‌سترین چهر ، دو تن از سرشنا ،Robert Griesemer، ایده ی ساخت یک زبان برنامه نویسی سیستمی جدید را با یست نگ‌شان به معرفیینیاز

در میان گذاشتند.Googleیکی دیگر از مهندسین مشغول در

گ‌نها کار بر روی این زبان جدید را شرو ع کردند و در این مدت تعداد دیگری از همکارانشان همچون Russ Coxآ

گ‌نها ملحق شدند. Andrew Gerrand و Brad Fitzpatrickو (شاید بد نباشد اگر این اسامی را گوگل کنید!) به تیم آ

، اولین نسخه ی آزمایشی زبان با پشتیبانی گوگل به صورت متن باز به عموم برنامه نویسان2009در نوامبر سال گ‌هی این پروژه شرکت داشته۳۰۰عرضه شد. از آن زمان تا کنون بیش از نفر از برنامه نویسان داوطلب در توسع

اند!

زیادی استفاده از آن را شرو ع کردند. با اینکه زبان در نسخهStartupاز اولین ماه انتشار این زبان، شرکت های گ‌یبرد، اما برای خیلی ها وجود نام کافی بود تا از کیفیتRob Pike و Ken Thompsonی آزمایشی به سر م

زبان اطمینان حاصل کنند.

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 8: go language

گ‌گتر اما، منتظر نسخه ی پایدار زبان ماندند. تا اینکه در ماه مارس سال از1.0، نسخه ی 2012شرکت های بزر به صورت پایدار منتشر شد.Goزبان برنامه نویسی

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

میکنیم:

Google Youtube BBC

Canonical Nokia Siemens bitly

Heroku CloudFlare SmugMug

Feedbooks iron.io moovweb

Airbrake swirl.us SoundCloud

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 9: go language

گ‌م برای Goتقریبب ًا در تمام اسامی بال، از گ‌نهای استفاده شده است. جایی که Back-endهای طراحی سیست زباگ‌یشود؛ در خیلی از مواقع هم برای رسیدن بهJVMاز ندارند و معمول را اسکریپتی قدرت مناسب استفاده م

گ‌یآی به میان C و ++Cسرعت بالتر، پای کدهای د.م

گ‌نهای برنامه نویسی زبانی بوده که توانسته باشد فقط با گذشت گ‌یکنم در تاریخ زبا ماه از انتشار اولین۷ فکر نمنسخه ی پایدارش، با چنین مقبولیتی روبرو شود.

گ‌نهایی مثل ++Goمسلم است که و ... Python و Java و C هنوز در اول راه است، و برای رسیدن به جایگاه زباگ‌یرسد ،راه درازی در پیش دارد برای «شرو ع» بسیار موفق عمل کرده است.که اما به نظر م

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 10: go language

Goیک زبان مدرن و همه منظوره است

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

گ‌تهای زبان تا یک سال بحث و تبادل نظر گ‌هاند. طبق گفته ی تیم توسعه، بر سر بعضی از قابلی گ‌هسازی شد و پیادصورت گرفته است!

Rob Pikeعنوان میکند که ایده ی اولیه آنها ساخت یک زبان سیستمی بود که بتواند جایگزین مناسبی برای ++ Cباشد. در روزهای اول، حتی سایت پروژه هم Goرا به عنوان زبانی برای برنامه نویسی سیستم معرفی می

گ‌نهای سطح گ‌نها بر سادگی، باعث شده نظر برنامه نویسان زبا گ‌ا گذشت زمان متوجه شدند که تأکید آ کرد. اما ب جلب شود؛ این قضیه برای تیم توسعه هم جالب بود!Go هم به Ruby یا Pythonبالتری مثل

گ‌یتوان گفت که گ‌رواقع م را با سهولت و سادگی زبانی مثلC با ظرافت فراوان قدرت و سرعت زبانی مثل GoدPython گ‌ههایکرده ترکیب گ‌هها را پوشش دهد، از برنام . به همین دلیل قادر است طیف بسیار وسیعی از برنام

گ‌ههای ساده ی چند خطی. ؟چه کسی گفته که یک زبان سیستمی، حتمب ًا باید سخت باشدسیستمی گرفته تا برنام

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 11: go language

Goیک زبان «آزاد» و متن باز است

ب ًل آزاد است و تحت کنترل هیچGoبا اینکه مستقیمب ًا از طرف گوگل پشتیبانی می شود، ولی یک زبان کام اعلم کرده که برای اثبات این موضو ع، از قصد هیچ لوگو ای از شرکت گوگل را در سایتPikeشرکتی نیست.

این زبان قرار نداده اند!

این یعنی: .سیاست کاری و تجاری هیچ شرکتی بر آینده ی زبان تأثیر نخواهد گذاشت.توسعه و بهسازی زبان با سرعت بیشتری انجام می شود.گ‌یتوانند به طور شفاف تمام مراحل توسعه را دنبال کنند همه م.گ‌هها و فریم ورک های متن باز بیشتری برای زبان وجود خواهد داشت کتابخان...…

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 12: go language

Goیک زبان کامپایل شونده است

گ‌ههای نوشته شده در گ‌نها را Goبرای اجرای برنام کد ماشین نمایید. خروجی عملیات کامپایل، Compile، باید آ ، و بدون نیاز به تفسیر.JIT، بدون نیاز به VMاست. بدون نیاز به

، حاصل برنامه ی شما مستقیمب ًا کدهای ماشین خواهد بود.C همانند

arm و x64 و x86 نوشته شده، قادر است برای پلتفرم های C که خودش در زبان Goدر حال حاضر کامپایلر

گ‌هها در شدنکد ماشین تولید کند. سرعت کامپایل و در این زمینه جای هیچ بالست! بسیار بسیار Go برنامگ‌نهای کامپایلری مانند ++ و … باقی نگذاشته است.C و #Java و Cرقابتی را برای دیگر زبا

گ‌م عامل های منتشر میWindows و FreeBSD و Mac و Linuxخود کامپایلر نیز به صورت رسمی برای سیستگ‌مهای دیگری مثل گ‌هاند که روی سیست و Plane9 و Androidشود. اما به شکل غیر رسمی، کاربران گزارش کرد

گ‌هی ها هم موفق به اجرای آن شده اند.BSDبقیه زبان در این زمینه پیشرفت زیادی داشته است)۱.۱(نسخ

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 13: go language

گ‌ههای مدیریت پروژه مثل makefile نیاز به چیزهایی شبیه Goدر ازGo نیست. کامپایلر Maven ها و یا برنام در آن قرار دارد شرو ع کرده و خودش بقیه کدهای مورد نیاز را شناسایی و لینک می نماید!mainفایلی که تابع

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

گ‌ینماید. به این معنی که حاصل کامپایلStatic کدهای شما را به شکل Goلزم به ذکر است که کامپایلر لینک مگ‌هی شما از تعداد زیادی گ‌کتکه» خواهد بود؛ مهم نیست که برنام گ‌هی شما در نهایت «یک» فایل اجرایی «ی برنام

، چیزی که در نهایت به شما تحویل داده خواهد شد یک فایلتشکیل شدهجانبی های Package فایل و یاگ‌شنیازی لزم ندارد و به راحتی قابل گ‌های دیگربه دستگاه انتقالاجرایی ساده است که برای اجرا شدن هیچ پی

(برای مثال، دستگاه مشتری)است.

گ‌نهای دیگر باعث Goکامپایلر بهGo می شوند، همگی در Warning با کسی شوخی ندارد! چیزهایی که در زباب ًل اگر یک متغیر تعریف کرده باشید اما از آن استفاده نکرده باشید،Errorعنوان گ‌هاند. مث در نظر گرفته شد

چنینGo کل عملیات کامپایل را متوقف میکند! در Error سطحی، با یک پیغام Warningکامپایلر به جای یک اشتباهاتی پذیرفتی نیست!

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 14: go language

Go و Syntaxآشنا

Go گ‌هی گ‌ی است از خانواد گ‌هنویسانی که با C زبان Javascript و PHP و C و #Java و C و ++C و به همین دلیل برنام

این زبان را یاد خواهند گرفت. برای مثال با کمی دقت در کد زیر،Syntaxو... آشنایی دارند، بسیار راحت براحتی متوجه منظور آن خواهید شد:

package main

import "fmt"

func main () { a := []int{11, 22, 33, 44, 55} s := 0 for i := range a { s += a[i] } fmt.Printf("%d \n", s) //output: 165}

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 15: go language

Syntax یک زبان تأثیر زیادی در پیشرفت آن دارد. وقتی Syntaxگ‌تتر آن را گ‌هنویسان راح زبان آشنا باشد، برنام محبوبیت، سازندگان زبان بابا بال رفتنیاد خواهند گرفت و به همین نسبت محبوبیت زبان بالتر خواهد رفت.

گ‌یشوند. گ‌هنویسان به زبان بالتراشتیاق و سرعت بیشتری به کار توسعه مشغول م در این حالت ضریب اعتماد برنامگ‌یرود گ‌یشود.م گ‌هها و ابزارهای بیشتری برای زبان تولید م و کتابخان

گ‌لاند. تا زمانی که گ‌هنویسان بیشتر از اینکه کدنویسی کنند، به کدخوانی مشغو یک زبان توسط برنامهSyntaxبرنامگ‌نهای گ‌یتواند محبوبیت چندانی پیدا کند. برای مثال زبا با آن همهFunctionalنویسان پذیرفته نشود نم

گ‌تهای منحصر به فردی که دارند، در اکثر اوقات فقط به دلیل داشتن نا آشنا در رابطه با جذبSyntaxقابلیگ‌یشوند. گ‌هنویسان با مشکل مواجه م برنام

Syntax زبان Go گ‌یتوان ترکیبی از گ‌نهای Syntax را م به حساب آورد. سعی شده تاPascal و Python و C زباSyntax زبان کوچک، تمیز، و قابل فهم باشد. برای مثال ساختار حلقه در Go فقط با forگ‌هسازی شده و پیاد

گ‌هاند. do یا whileحلقه های از آن حذف شد

گ‌هی جالب دیگری در مورد است! و به همین دلیل پردازشRegular این است که گرامر آن Go زبان Syntaxنکتگ‌شفرض تمام سورسCoding ها بسیار آسان خواهد بود. همچنین IDE برای ابزارهای جانبی مثل Goکدهای پیگ‌لها گ‌هاند!! )UTF-8 خودشان خالق Rob Pike و Ken Thompson( چرا که است! UTF-8فای بود

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 16: go language

Go ) یک زبان رویه ای است Procedural(

گ‌یآید این است که آیا گ‌هنویسان مشتاق پیش م گ‌یگراست؟ Goسؤالی که برای تعداد زیادی از برنام یک زبان ش

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

توضیح : اینطور نیست که در زبانی باشد و در زبان دیگری وجود نداشتهشی گرایی یک «مفهوم» است، نه یک «قابلیت»!

گ‌یتوان از مفاهیم شی گرایی استفاده کرد. هم که شی گرا نیست C انند در زبانی مبرای مثالنباشد! حتی در مگ‌یگرایی بهره برد!Lispگ‌ مانند Functionalیک زبان گ‌یتوان از ش هم م

گ‌هسازی کدهایJava البته مسلم است که اگر یک زبان دارای «گرامر» خاصی برای این منظور باشد (مانند ) پیادگ‌نتر خواهد بود. شی گرا در آن آسا

گ‌های که باید درک شود این است که شی گرا بودن یک زبان، به هیچ عنوان تضمینی بر کیفیت ساخت اولین نکتگ‌یشوند هم نیست! آن زبان نیست! حتی تضمینی بر کیفیت کدهایی که در آن زبان نوشته م

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 17: go language

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

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

شما نشان میدهم که از مخالفان معروف شی گرایی به حساب می آیند:

Ken Thompsonگ‌هدهنده B، خالق زبان برنامه نویسی Unix(خالق سیستم عامل …. )Go، خالق زبان برنامه نویسی UTF-8 خالق کدینگ ، Regular expressions، اولین توسع

Dennis Ritchie ، …. )C، خالق زبان برنامه نویسی Unix(نفر دوم در خلق سیستم عامل

Rob Pike، …. )Go، خالق زبان برنامه نویسی Limbo، خالق زبان برنامه نویسی UTF-8، خالق کدینگ Plan9 و سیستم عامل Unix(عضو تیم توسعه سیستم عامل

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 18: go language

Richard Stallman و …. )Emacs، GDB، Gmake، از توسعه دهندگان اولیه GCC، از توسعه دهندگان اولیه مجموعه کامپایلرهای GNU(خالق پروژه

Linus Torvalds، …. )Git، خالق Linux(خالق سیستم عامل

Rich Hickey ، …. )Clojure(خالق زبان برنامه نویسی

Joe Armstrong، …. )OTP، از طراحان پلتفرم Erlang(خالق زبان برنامه نویسی

Simon Peyton-Jonesگ‌هدهنده ی اصلی کامپایلر Haskell(از طراحان اصلی زبان برنامه نویسی ، ….)GHC، توسع

Paul Grahamگ‌تهایی مثل Y Combinator، مؤسس شرکت Arc(خالق زبان برنامه نویسی است…. )Scribd, reddit, Dropbox, Disqus– شرکتی که مولد سای

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 19: go language

Edsger Dijkstra(از بزرگترین محققان دنیای کامپیوتر وابدا کننده ی الگوریتم های تأثیر گذاری مثل الگوریتم معروف «دایکسترا» …. )

Alexander Stepanov ، …. )C در زبان ++STL(طراح اولیه کتابخانه

Luca Cardelliگ‌نهای ML– زبان ML(نویسنده اولین کامپایلر زبان برنامه نویسی می باشد، از طراحان زبان برنامه نویسیF و #OCaml، Haskell ریشه ی اصلی زبا

Modula-3( .… ،

گ‌یتوانید با ایمیل من تماس بگیرید. در صورت درخواست منبع برای هر کدام از این اسامی، م

گ‌هنویسی هستند؛ اگر هیچکدام از این افراد نظر گ‌سترین افراد در دنیای برنام گ‌نها سرشنا گ‌یتوان گفت که ای خیلیمگ‌یگرایی ندارند، پس شاید بد نباشد که کمی از وقت خود را به تحقیق در این رابطه اختصاص مثبتی نسبت به ش

دهید!

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 20: go language

در برابر شی گراییGoساختار رویه ای

گ‌نهایی مثل Goطراحان پیچیدگی های زیادیC و ++C و #Java بر این باورند که مدل شی گرایی در زبادارد. و این پیچیدگی در زبان، باعث تولید کدهای پیچیده خواهد شد.

Go) یک زبان رویه ای است Procedural اما نه یک زبان رویه ایی کلسیک مانند ،(C.

گ‌هاند تا Goطراحان را به یک زبان رویهGo نوآوری های جالبی در ساختار کلسیک زبان های رویه ایی ایجاد کردای «مدرن» تبدیل کنند!

گ‌نهای دیگر حس گ‌یگرایی مرسوم در زبا برنامه نویسان با کمک این ساختار رویه ایی مدرن، نیاز چندانی به آن شگ‌ههای جدید در این زمینه آشنا می شوید....Goنخواهند کرد. در ادامه با تعدادی از اید

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 21: go language

اه‌سها و اشیا : ابتدا یک توضیح ساده درباره کل

گ‌یتواند یک گ‌نهای برنامه نویسی روشی وجود دارد که برنامه نویس به کمک آن م Data Typeدر بیشتر زبا

خوانده می شود، الگویی است که تعیین میکند یک «داده»Type که به اختصار Data Typeجدید ایجاد کند. چه ساختاری در حافظه خواهد داشت و چه عملیاتی میتوان روی آن انجام داد.

گ‌شهای مختلفی برای ساخت یک گ‌نهای مختلف، رو ب ًل در زبان Typeزبا برای اینstruct از C ارایه کرده اند. مثگ‌نهای شی گرا هم ساختاری وجود دارد به نام typedefمنظور استفاده می شود. (با همراهی Class ) در اکثر زبا

جدید را میدهد.Typeکه به برنامه نویس امکان ساخت یک

گ‌نهای شی گرا، یک گ‌یتواند از تعدادی فیلد و متد تشکیل شود که به ترتیب تعیین کننده یTypeدر زبا م هستند.Type» آن رفتار» و «خصوصیات«

را در حافظه ایجاد کنید. در زبان های شی گرا اینType» از آن نمونه، باید یک «Typeبرای استفاده از یک گ‌هها» را اصطلحا یا «شی» می نامند.Object«نمون

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 22: go language

Go به جای Class از struct:استفاده میکند

Go هم مثل Cاز struct ها برای ساخت یک Type جدید استفاده میکند. با این تفاوت که struct های Go

گ‌یتواند علوه بر داشتن فیلد، دارای متد هم باشد. Go در struct پیشرفته ترند. یک Cنسبت به م

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

گ‌ر واقع با وجود داشتن چنین ندارید! همانClass، شما نیازی به داشتن چیزی مثل Go هایی در زبان structدگ‌کتر قابل انجام خواهدstruct ها قابل انجام است، با این Classکارهایی که با گ‌تتر و سب های جدید خیلی راح

بود.

گ‌هنویسی گ‌ههای اولیه خود دارایMozilla هم که در حال توسعه از طرف Rustزبان برنام است، با اینکه در نسخ هایی مشابهstruct را از زبان حذف کرد و آن را با Class ، ساختار 0.4 بود، اما در نسخه ی Classساختار

وجود دارد جایگزین نمود.Goچیزی که در

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 23: go language

Go از Composition:به جای «وراثت» استفاده میکند

Java++ سعی کرد با حذف قابلیت «وراثت چندگانه» که در Cوجود داشت، باعث ساده شدن مکانیزم وراثت در ب ًل با حذف وراثت، Goزبان شود. را به جای آن جایگزین کرد.Composition یک قدم جلوتر رفت و ک

Composition چیست؟ فرض کنید دو struct به نام های A و B .تعریف کرده ایم B گ‌یتواند را مانند یکA م دسترسی داشته باشد.A خود قرار دهد تا به اعضای موجود در structفیلد معمولی در

. به این ترتیب بدون درگیر شدن با پیچیدگی های مبحثC های تو در تو در زبان structهمانند شیوه ی گ‌یتوانیم مکانیزمی شبیه آن را در کدهایمان داشته باشیم. وراثت، م

گ‌نهای شی گرا از یک سیستم سلسله مرتبه ایی برای کار با اشیاء بهره می برند. گ‌یدانید که خیلی از زبا حتمب ًا مب ًل در بیشتر آن ها، یک شی وجود دارد و بقیه اشیاء همگی به طریقی از آن ارث می برند.Objectمث

برای خودش مستقل است. نیازی نیست کامپایلر در هر عمل کامپایلType چنین چیزی وجود ندارد. هر Goدر نیز همین مساله است.Go ها را چک کند. یکی از دلیل اصلی سرعت کامپایلر Typeرابطه ی وراثت بین

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 24: go language

گ‌بسازی در ، متوجه مزیت آن نسبت به وراثتGoاطمینان داشته باشید که خودتان هم با استفاده از قابلیت ترکیخواهید شد.

که یکی Design Patterns: Elements of Reusable Object-Oriented Softwareحتی در کتاب گ‌ب مرجع در زمینه شی گرایی می باشد، شده که:عنواناز معروف ترین کت

گ‌بسازی اشیاء را به وراثت ترجیح دهید« »ترکی"Favor 'object composition' over 'class inheritance'."

گ‌کترین معنی ای بود که توانستم برای واژه ی پ. گ‌بسازی نزدی در نظر بگیرم.compositionن: ترکی

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 25: go language

Go:اه‌یتواند برای اعضا حق دسترسی تعیین کند م

درPackage)، آن عضو فقط برای اعضای داخل helloاگر نام یک عضو با حرف کوچک شرو ع شود (مثل دسترس است.

گ‌یتواند در محیط خارج از Helloاگر نام یک عضو با حرف بزرگ شرو ع شود (مثل نیز درPackage)، آن عضو مدسترس قرار گیرد.

گ‌یتوان به سطح دسترسی آن پی برد. در این حالت فقط با یک نگاه به نام آن عضو، م

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

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 26: go language

Go دارای ساختار interface:است

interface گ‌یگرا در گ‌نهای ش گ‌تهای معرفی شده توسط زبا حظور دارند.Go به عنوان یکی از بهترین قابلیگ‌هنویسان ب ًل آشنایی دارند.interface با C و #Javaبرنام ها کام

وابستهinterface هایی که به یک Type یک «سند قرارداد» است. تمام مشابه interfaceبه زبان ساده، یک گ‌فاند از قراردادهایی که توسط آن interface تعریف شده تبعیت کنند. بدین صورت آن interfaceهستند موظ

گ‌تهای مختلف، به وکالت از تمام گ‌یتواند در موقعی های وابسته به آن مورد استفاده قرار بگیرد. (به جایTypeمگ‌ن گ‌کتک آ ها را جداگانه احظار کنید.)Typeاینکه ت

گ‌یشود. Type و Interface، قرارداد بین یک Goدر های وابسته به آن، فقط شامل تعاریف متدها م

Interface ها نگرش اصلی زبان Go به مبحث Polymorphismگ‌تهای مهم گ‌نها به عنوان یکی از قابلی گ‌یباشند؛ آ مگ‌نها برای افرادAPIزبان تلقی شده و به هنگام ساخت گ‌یگیرند. مطالعه و یادگیری آ ها بسیار مورد استفاده قرار م

گ‌همند به زبان گ‌یشود.Goعلق توصیه م

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 27: go language

گ‌یگرا حتمب ًا ازClass چیزی تحت عنوان Goدرست است که ندارد، اما اجباری نیست که برای نوشتن کدهای شClass .گ‌یگرا طراحی کنید. ها استفاده کنید گ‌ههای خود را به صورت ش ایناجباری هم نیست که حتمب ًا برنام

گ‌نهایی مثل گ‌مای است که امثال زبا گ‌هاند.C و ++C و #Javaتوه به شما تلقین کرد

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

گ‌نهایی مثل Goمساله این است که دیدگاه گ‌هها، با دیدگاهی که در زبا با آنC یا #Java نسبت به ساخت برنامگ‌نها یکی است، اما روش کارشان با یکدیگر فرق دارد. آشنا هستید متفاوت است. هدف آ

گ‌هنویسی در گ‌یگیرد، نه ها و توابعType بر مبنای Goبرنام ... ها و متدهاClass صورت م

گ‌یگراییGoسازندگان گ‌تیافته در ابعاد وسیع، حتمب ًا باید به ش گ‌ههای ساخ گ‌یکنند که برای نوشتن برنام فکر نمگ‌بتری هم وجود داشته باشد. این دیدگاه شبیه همان نگرشی است که گ‌هتر و مناس گ‌ههای ساد متوسل شد؛ شاید را

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

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 28: go language

Go یک زبان Static-Typeاست

گ‌نهای گ‌نهای Staticزبا از سه مزیت عمده برخوردارند:Dynamic نسبت به زبا

!گ‌نهای سرعت گ‌یشود، سرعت اجرای برنامه به مراتبStatic چون در زبا گ‌هها از قبل مشخص م نو ع تمام دادگ‌نهای گ‌نهای Dynamicبالتر از زبا نو ع داده ها به هنگام اجرا مشخص خواهدDynamic خواهد بود. در زبا

شد.

!گ‌نهای امنیت گ‌هها و پارامترها را چک کند تا اگر برنامه نویس بهStatic در زبا کامپایلر قادر است تمام دادصورت سهوی متغیری را در جای اشتباهی به کار برده بود، قبل از کامپایل برنامه به او هشدار داده شود.

!گ‌نهای مستندات نیاز به دقت بالیی دارد. برای مثال باید نو عDynamic مستندسازی کدها در زباگ‌هنویسان دیگر بدانند که قرار است چه نو ع داده ایی پارامترهای یک تابع را در مستندات ذکر کنیم تا برنام

گ‌نهای نو ع هر پارامتر جزیی از خود کد است و برنامه نویس با یکStaticرا به تابع ارسال کنند. اما در زباگ‌هی آن بدست آورد. گ‌یتواند اطلعات زیادی دربار گ‌هی تعریف تابع م نگاه ساده به نحو

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 29: go language

گ‌نهای گ‌یکنند، یک عیب بزرگ نیز دارند: اینکه Staticجدای از مزایایی که زبا هستند!!Static ارائه م بودن یک زبان شبیه چاقوی دولبه است. مزیت اصلی آن، همان عیب آن است.Staticدرست است،

گ‌نها باید مدام با گ‌نهای Typeدر این زبا گ‌یدانند کهDynamic ها سر و کله بزنید. برنامه نویسان زبا به خوبی مDynamic.گ‌یشان تأثیر دارد بودن زبان دلخواهشان، تا چه میزانی در سرعت کدنویس

گ‌یتواند Goخوشبختانه ب ًل اگرType م گ‌یدهیم تشخیص دهد. مث یک متغیر را از روی مقداری که به آن نسبت م Type فرض خواهد کرد. این قابلیت شبیه سیستم int را از نو ع A متغیر Go بریزیم، A را در متغیر 12عدد

inference در زبان Haskell.است

گ‌یشوید کهTypeوقتی چنین سیستم تشخیص گ‌هها ادغام کنید، متوجه م گ‌ه و سریع کامپایل برنام ای را با مدل سادگ‌نهای خواهد بود.Dynamicسرعت کدنویسی شما قابل رقابت با سرعت کدنویسی در زبا

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 30: go language

گ‌های و کامپایلری -- و کمبود های C و Unix) به سنت Goمن فکر میکنم این (زبان « گ‌نهای پای رو جبرانC برگشته -- برگشتی به زبا به حساب میاد. و ازC قطعب ًا یک پیشرفت برای زبان Go یک پیشرفت در این زمینه بوده باشه، اما معتقدم که C++کرده، من فکر نمیکنم که

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

»جالبیه...

Joe ArmstrongOTP و پلتفرم Erlangخالق زبان برنامه نویسی

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 31: go language

Go و Concurrency

گ‌تها و منابع، تعریف درست و قابل قبل از هر چیز، نیاز داریم این مفاهیم را تعریف کنیم. متأسفانه خیلی از سای ارایه نکرده اند و درک این مفاهیم را برای خیلی از برنامه نویسان مشکلParallelism و Concurrencyفهمی از

ساخته اند.

گ‌یشویم:Rob Pikeدر ادامه با تعریف از این مفاهیم آشنا م

Concurrency که هدف مشترکی دارند. واحدهای اجرایی مستقل، : برنامه نویسی بر مبنای مجموعه ای از Parallelism سرعتی بالتر، با هدف دستیابی به موازی به صورت پردازش : توانایی اجرای چندین.

Concurrency یک برنامه است، اما ساخت مدلی برای Parallelism برنامه هاست. اجرای مدلی برای Concurrency برنامه اعمال می شود، اما ساخت در فاز Parallelism برنامه اتفاق می افتد. اجرای در زمان

واحدهای اجرایی مستقل از یکدیگرند، ولی هدف مشترکی دارند.Concurrencyدرگ‌هی جداگانه)Parallelismدر پردازش ها ممکن است هیچ ربطی به هم نداشته باشند. (مثل پرداز ِش دو برنام

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 32: go language

Concurrency اجرای Parallel ممکن است برنامه ی شما کند!‌نمی واحدهای اجرایی را تضمین Concurrent

). مهم این است که ساختارPython در Concurrency اجرا نشوند ( مثل Parallelباشد اما اجزایش به طور نوشته شده باشد. Concurrentبرنامه به صورت

Concurrencyگ‌یکند که در صورت وجود بستر سخت افزاری و نرم افزاری ساختاری را برای برنامه محیا م پردازش شوند.Parallel، اجزای مختلف برنامه بتوانند به شکل مناسب

اجرا نخواهد شد!Parallel ساخته نشود، به صورت Concurrentبه عبارت دیگر، اگر برنامه ای به صورت مبحث جداگانه ایست که ربطی به بحث فعلی ندارد.Parallel کردن چندین نمونه از یک برنامه در حافظه برای انجام پردازش Loadالبته

گ‌گ‌هاش اعمال کند. قانونConcurrencyهر برنامه نویس هم ممکن است به شیوه ی متفاوتی را در ساختار برنامگ‌ههای وجود ندارد.Concurrentثابتی برای طراحی برنام

در دسترس باشدCPU، حتمب ًا باید بیش از یک هسته ی Parallelلزم به ذکر است که برای دستیابی به پردازش به شکل واقعی اتفاق بیفتد.Parallelتا پردازش

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 33: go language

گ‌مهای توزیع شده، و نیاز وب گ‌لهای اخیر با گسترش استفاده از پردازنده های چند هسته ایی، سیست در ساگ‌خگو بودن به تعداد بالیی از درخواست ها، وجود بستری مناسب برای برنامه نویسی سرویس ها برای پاس

ب ًل قابل احساس است.Concurrent«همروند» ( ) کام

گ‌عگرا» ( گ‌نهای «تاب را به شما تلقین میConcurrent ) که به طور ذاتی برنامه نویسی Functionalدر این بین، زبا کنند ( توضیح در این باره خارج از بحث این نوشته است)، در این زمینه پیش افتاده اند و هر روز بر

گ‌نهایی مثل گ‌تشان افزوده می شود. زبا و ….Clojure و Haskell و Erlangمحبوبی

گ‌نهای «دستوری» ( گ‌نها هنوز هم بهImperativeزبا گ‌شهایی کرده اند، اما اکثر آ ) هم هر کدام در این راستا تل ها استفاده میکنند.Process ها و Threadطور مستقیم از

گ‌هی پردازش ها درنهایت بر پایه ی گ‌نهاProcess ها و Threadدرست است که مبنای کار هم ها خواهد بود، اما ایگ‌هسازی گ‌نها برای پیاد گ‌یشوند و استفاده ی مستقیم از آ جزو مفاهیم سطح پایین یک سیستم عامل محسوب م

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

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 34: go language

گ‌یرسد استفاده از تکنیک گ‌ههایAsynchronous ( عملیات ناهمگامبه نظر م ) تا حدودی به روند ساخت برنامConcurrent .گ‌نها کمک کرده و بهینگی لزم را برای آنان فراهم نموده است در این زبا

گ‌ههایی مثل گ‌ههای موفق درJavascript برای node.js یا محیط های همچون Python در geventکتابخان از نمون می باشند. با اینکه چنین فریم ورک هایی از استقبال بسیار خوبیAsynchronousبکارگیری تکنیک عملیات

به حساب نمی آید.Concurrentبرخوردار شده اند، اما راه حل جامعی برای برنامه نویسی

گ‌هها که رخدادهای Asynchronousحقیقت این است که عملیات در مقیاس بالI/O برای گونه ی خاصی از برنامگ‌یافتند بسیار خوب عمل میکند (مثل وب سرورها) اما وقتی صحبت از پردازش های سنگین گ‌نها اتفاق م در آ

گ‌یشود، مدل راه حل مناسبی ارایه نمی کند.Asynchronousم

اگر قسمتی از برنامه نیاز به پردازش طولنی مدت داشته باشد، بقیه اجزا باید منتظرAsynchronousدر مدل پردازش می شود. از همینThreadبمانند تا کار آن قسمت تمام شود؛ چرا که تمام اجزای برنامه فقط در «یک»

رو پردازش ها باید بسیار کوچک و گذرا تعریف شوند.

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 35: go language

گ‌هسازی مناسب از قابلیت گ‌یرسد یک پیا باید دارای خصوصیات زیر باشد:Concurrencyبا توضیحات بال به نظر م

گ‌هسازی باید ساده و آسان باشد.Concurrencyپیادگ‌هسازی باید بهینه و سبک باشد.Concurrencyپیادگ‌هسازی باید تا جایی که ممکن است همه منظوره باشد.Concurrencyپیاد

گ‌هنویسی Goخوشبختانه یکی از دلیل اصلی ساخت زبان بوده است. اینConcurrent پشتیبانی قدرتمند از برنام Concurrencyزبان نه به صورت یک «کتابخانه» و نه به صورت یک قابلیت جانبی، بلکه به صورت درونی از

گ‌یکند. حتی دارای یک سینتکس مخصوص برای این کار است! پشتیبانی م

Go چنین بستری را مدیون تجربه ی سی ساله ی Rob Pikeدر زمنیه ی طراحی سیستم عامل ها و زبان های Concurrent .گ‌، چهر است کار این افراد در گذشته (و در حال) ساخت و طراحی سیستم عامل بوده است.ه باشد

گ‌هنویسی اهمیت زیادی دارد، طراحان زبان یک قابلیت منحصربه فرد راGo در Concurrentاز آنجایی که برنامبرای این منظور در زبان جاسازی کرده اند.....

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 36: go language

امیررضا قادری– Goمعرفی زبان برنامه نویسی

g o r o u t i n e s

Page 37: go language

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

این مفهوم دارد.

بیانگر این واحد اجرایی مستقل است. goroutine ساختاری به اسم Goدر زبان

گ‌ر واقع همانند یک goroutineیک گ‌نها بی دلیل نیست. اما قبل از هر چیز،Coroutine د است و تشابه اسمی آ ها آشنایی ندارند:Coroutineتوضیح کوتاهی داشته باشیم برای افرادی که با

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

برود!Standbyدر میانه ی راه متوقف کند و به حالت

ب ًل متوقف شده بود ادامه پیدا می کند. این بعد ها اگر دوباره به این تابع بازگشتیم، اجرای تابع از جایی که قبگ‌یسازد تا گ‌نها سوییچ کند. Coroutineقابلیت برنامه نویس را قادر م ها را زمانبندی نماید و یا بین آ

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 38: go language

گ‌هداری وضعیت کلی برنامه، برای هرStackرمز کار در این است که علوه بر داشتن یک سراسری برای نگCoroutine نیز یک Stack گ‌یشود تا بتواند وضعیت فعلی خود را به هنگام سوییچCoroutine جداگانه ساخته م

شدن در آن ذخیره کند.

دیگری سوییچThread به Thread وقتی سیستم عامل از یک است.Thread بسیار شبیه یک Coroutineیک گ‌یبرد تا وقتی دوباره به آن برگشت آن Standby قبلی را به حالت Threadمی کند، قادر به ادامهThread فرو م

گ‌یزنند چرا کهGreen Thread ها را با نام Coroutineی اجرایش باشد. برای همین است که گاهی هم صدا مگ‌نها بسیار شبیه هاست.Threadرفتار آ

Coroutine گ‌نهایی مثل گ‌نهایPython , Ruby, Lua, Perl, Scheme, Haskell, Erlang ها در زبا و خیلی زبادیگر وجود دارند، هرچند که ممکن است با اسم متفاوتی ظاهر شوند.

Lightweight Process با نام Erlang ، و یا در Fiber با نام Ruby ، در Greenlet با نام Pythonبرای مثال در

گ‌هسازی گ‌هی خاص خودشان را در پیاد گ‌نها سلیق ها اعمالCoroutineشناخته می شوند. البته هر کدام از این زباکرده اند.

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 39: go language

Coroutine ها چندین فرق اساسی با Thread:ها دارند

عمل زمانبندی و سوییچ کردن بینThread.ها به صورت اتوماتیک و توسط سیستم عامل انجام می شود Coroutine ها خود برنامه نویس باید به صورت دستی زمانبندی و کنترل اجرای Coroutineاما در مورد

ها را مدیریت کند.

از آنجایی کهCoroutine «گ‌ر واقع نوعی از توابع هستند، قالبا در داخل «یک گ‌یشود وThread ها د اجرا مگ‌هی پردازنده استفاده کنند. اما گ‌یتوانند براحتیThreadبه همین خاطر قادر نیستند از چندین هست ها م

گ‌ههای مختلف پخش شوند. روی هست

Coroutineکاری خود زبان برنامه نویسی مثل سیستم گ‌ی ها در لیه Runtime یا VMآن زبان اجرا و گ‌یشود.گ‌ی ها در لیهThreadمدیریت می شوند. اما کاری سیستم عامل اجرا و مدیریت م

چونCoroutineکاری زبان برنامه نویسی اجرا می شوند،گ‌ی ها نوعی از توابع معمولی هستند و در لیه گ‌هتر از گ‌هها و شاید هم صدها برابر سریعتر و بهین گ‌نها د گ‌نها در حافظه و یا سوییچ کردن بین آ پس اجرای آ

Thread !هاست

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 40: go language

گ‌هسازی منحصر به فرد زبان goroutineیک گ‌ر واقع پیاد هاست که به عنوان واحد اصلیCoroutine از Go دConcurrency در این زبان جاسازی شده است. در ادامه با خصوصیات goroutine:گ‌یشوید ها آشنا م

اجرایgoroutineگ‌یگیرد و در لیهگ‌ی ها در لیه )Runtime خود زبان (سیستم گ‌ی سیستم عامل صورت نمگ‌هی اجرای مدیریت می شود. گ‌هgrotoutine( البته وظیف گ‌هی گ‌ی ها در لی هاست)Thread سیستم عامل به عهد

زمانبندیgoroutine ها به طور اتوماتیک توسط سیستم Runtimeگ‌یشود و این مسئولیت از زبان انجام م )Preemptive تقریبا(زمانبندی دوش برنامه نویس برداشته شده است.

سیستمRuntime گ‌یتواند ها نیزThread پخش کند و چون Thread ها را روی چندین goroutine مگ‌ههای مختلف گ‌یتوانند روی هست گ‌یافتد.Parallel پخش شوند، پس اجرای واقعی CPUم اتفاق م

سیستمRuntime در Go فقط مسئول کنترل goroutineها در یک ماشین است. یعنی یک ماشین با گ‌شهای CPU ، یا یک CPUچند گ‌هنویس طراحیDistributed چند هسته ای. پرداز باید توسط خود برنامشود.

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 41: go language

goroutine عدد 1000 ها بسیار سبک و بهینه هستند. در کامپیوتری که ممکن است با ایجاد Thread

گ‌یتوان گ‌شفرض goroutine عدد 1,000,000کرش کند، م goroutine برای هر Stack را اجرا کرد! سایز پی

است! 4kBفقط

goroutine ها بلک نمی شوند. اگر در یک goroutine عملیات بلک شونده ی I/Oصورت بگیرد، بقیه goroutine ها در Thread .دیگری به اجرای خودشان ادامه می دهند

در جایی هم که ممکن باشد، سیستمRuntime خود به خود از عملیات Asynchronousبرای رخدادهای I/O گ‌هنویسی درگیر شوید!!Asynchronous استفاده میکند!!! شما نیاز نیست با مدل برنام

goroutine سیستم انتقال پیام ها بر مبنای ) Message Passingگ‌یکنند و به این شیوه قادرند ) کار مگ‌مها توسط Goبا یکدیگر در ارتباط باشند. در ها که در واقع همان کانال های ارتباطی بینchannel پیا

goroutine.گ‌یشوند ها هستند رد و بدل م

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 42: go language

گ‌، عمل انتقال پیام در گ‌شفرض گ‌یافتد. یعنی پیام فقط زمانیSynchronous به شکل Goبه صورت پی اتفاق مگ‌هنویسی می گ‌هتر شدن برنام گ‌یشود که فرستنده و گیرنده هر دو آماده باشند. این قضیه باعث ساد فرستاده م

گ‌یتوانید عمل انتقال پیام را به شکل نیز انجام دهید. Asynchronousشود. البته در صورت لزوم م

Channel های Go مانند خود زبان Static Type هستند. اگر یک channelتعیین کند که قرار است فقط گ‌ههای گ‌هی دیگری از آن نخواهد گذشت.intداد را ردو بدل کند، داد

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 43: go language

ب ًل متوجه شباهت شده اید. البته این دوErlang های Lightweight Process و Go های goroutineاحتماگ‌های بسیاری با یکدیگر دارند. گ‌تهای پای CSP ها بر مبنای مدل goroutineجدای از شباهت ظاهری، تفاو

گ‌هاند در حالی که گ‌هسازی شد گ‌هاند.Actor ها بر مبنای مدل Lightweight Processپیاد توسعه پیدا کرد

به شرح زیر است:Actor و مدل CSPمهمترین تفاوت مدل

در مدلCSP واحدهای اجرایی بی نام هستند در حالی در مدل Actor.گ‌یباشند دارای شناسه م

گ‌م در مدل گ‌یگیرد در حالی که در مدل Synchronous به شکل CSPارسال پیا به شکلActor انجام مAsynchronous.گ‌یافتد اتفاق م

ارسال پیام در مدلCSP به کمک Channel گ‌یگیرد ولی در مدل مستقیم و بدون واسطهActor ها انجام ماست.

گ‌لها مزایا و معایب خودشان را دارند. همچنین باید دقت داشت که یک زبانErlang مانند Goهر کدام از این مدFunctional نیست و از ساختارهای Immutableاستفاده نمی کند، پس لزم است برنامه نویس کمی بیشتر در

گ‌ههای محتاط باشد!Concurrentساخت برنام

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 44: go language

Rob Pike در یک ویدیو آموزشی در Youtube به نام Go Concurrency Patternsجالب از تواناییی مثال goroutine صدهزار ها را به همگان نشان داد. او کدی نوشته بود که goroutine.را در حافظه ایجاد میکرد

گ‌یچرخید و هر goroutine بین این intسپس یک عدد گ‌هدست م گ‌تب هم یک واحد به آن عددgoroutine ها دسگ‌یکرد. اضافه م

گ‌هی Pikeدقت کنید که برنامه کامپایل نشده بود. بنابراین وقتی را فشار میداد، برنامه باید کامپایلRun دکم بهیک ثانیهمیشد، لینک میشد، در حافظه اجرا میشد، و جواب اجرا برگشت داده میشد.... کل این پروسه فقط

طول انجامید!!!

گ‌هی ب ًل اجرای یک برنام که از قبل هم کامپایل شده باشد، ممکن است بیشترC یا #Java در Hello Worldاحتماگ‌هی شوخی دا گ‌یکند. شتاز یک ثانیه به طول انجامد! این حرف جنب ;-) و از نظر علمی چیزی را ثابت نم

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 45: go language

Go ه‌تهای Functional و قابلی

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

گ‌هایی و نیاز به بستری مناسب برای CPUبود، و همچنین رایج شدن و پیشرو بودنConcurrency های چند هستگ‌نهای گ‌نها معطوف شده است.Functionalزبا در این زمینه، توجه همه به آ

گ‌نهای reduce و ()map توابع () گ‌نهای Functional از توابع اساسی زبا گ‌یباشند و تقریبب ًا در تمام زبا حظور دارند.Functional م

گ‌نهای غیر گ‌نهای Javascript و Ruby وPython مثل Functional حتی زبا Functional و … هم با اینکه جزو زبا

گ‌نهای گ‌یهای زبا گ‌یآیند اما دلشان نیامده تا بعضی از ویژگ را ارایه نکنند.Functionalبه حساب نم

Go یک زبان سیستمی است؛ یعنی هرچقدر هم که ساده باشد، باید همانند Cگ‌ههای سطح پایین خود را جنبگ‌هاندGo داشته باشد. اما طراحان Functionalحفظ کند. نباید انتظار داشت که چنین زبانی گرایش ترجیح داد

به زبان اضافه کنند.Functionalکه کمی هم چاشنی

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 46: go language

گ‌یآیند (توابع ، Goدر گ‌یتوان:First-Class جزو اعضای درجه اول زبان به حساب م ). یعنی م

،یک تابع را همانند مقادیر معمولی به عنوان آرگومان به توابع دیگر ارسال کرد

،یک تابع را به عنوان جواب خروجی از تابع دیگر برگشت داد

یک تابع را به یک متغیر نسبت داد؛ به همان صورتی که یک عدد را به یک متغیرint.نسبت میدهیم

Go) گ‌ینام توابعیAnonymous ) است. توابع Anonymous functions همچنین دارای قابلیت استفاده از توابع بگ‌های» تولید شوند و مورد استفاده قرار بگیرند؛ یعنی نیازی نیست که مانند گ‌یتوانند به صورت «لحظ هستند که م

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

Closure را هم داشته باشد، یعنی Anonymous باشد، و امکان تعریف توابع First-Classوقتی زبانی دارای توابع

گ‌هنویسانیClosureها نیز در آن زبان حظور دارند. کار ها بر مبنای توابع تو در تو استوار است. ممکن است برنامگ‌نهای Closure ها آشنا نباشند. پس بهتر است کمی درباره Closure آشنایی دارند با Functionalکه کمتر با زبا

ها توضیح دهیم...

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 47: go language

ها :Closureتوضیح درباره گ‌یروند. در گ‌یشوند پس از اتمام اجرای آن تابع از بین م به حالت معمول فیلدهایی که داخل یک تابع تعریف م

گ‌نها گ‌نهایی که توابع در آ گ‌یتواند یک تابع دیگر باشد؛ به همان صورتیFirst-Classزبا هستند، خروجی یک تابع م به عنوان خروجی در نظر گرفته شود.intکه ممکن است یک عدد

گ‌یدهد. مسلماInner که یک زیرتابع به اسم Outerفرض کنیم تابعی داریم به نام را به عنوان خروجی برگشت مگ‌یدهد، اجرای تابع Inner تابع Outerوقتی که تابع گ‌یگردد. در چنینOuter را برگشت م تمام شده قلمداد م

از بین برود.Outerحالتی باید تمام فیلدها و اطلعات تابع

استفاده کرده باشد، آنOuter که به عنوان خروجی برگشت داده شده، از فیلدهای تابع Innerاما اگر تابع گ‌یتواند حتی بعد از اتمام کارInner از بین نخواهند رفت! بنابراین تابع Innerفیلدها تا زمان زنده بودن تابع م

گ‌هی داخلی خودش،Inner هم از فیلدهای آن استفاده کند. تابعی مانند Outerتابع گ‌یتواند برای استفاد که مگ‌ههایی از خارج را به خود وابسته سازد، گ‌یشود. Closureداد نامیده م

گ‌هایی مثل Closureدرک بهتر کارjQuery ها به کمی زمان و تمرین نیاز دارد؛ اما بدانید که اگر با کتابخانگ‌هها بار بدون اینکه خودتان متوجه شوید از ب ًل د گ‌یکنید، احتما گ‌هاید!Closureم ها استفاده کرد

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 48: go language

کتابخانه استاندارد، مستندات، ابزارها

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

Package :هایی برای آرشیو و فشرده سازی tar, zip, bzip2, flate, gzip, lzw, zlib, . . . .

Package:هایی برای رمزنگاری و عملیات هش aes, cipher, des, dsa, rc4, rsa, md5, sha1, sha256, sha512, tls, x509, . . . .

Package:گ‌لها مختلف هایی برای کار با فایbase32, base64, binary, csv, gob, hex, pem, json, xml, . . . .

Package:هایی برای کار با گرافیک دو بعدی color, draw, gif, jpeg, png, . . . .

Package:هایی برای کار با مباحث شبکه http, cgi, fcgi, mail, url, jsonrpc, . . . .

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 49: go language

گ‌یشود. تمام Goذات سیستمی زبان گ‌هاند. برای داشتنGo های بال در Package در اینجا مشخص م نوشته شدگ‌ههای نوشته شده در زبان Packageخیلی از این گ‌نهای دیگر، باید متوسل به کتابخان گ‌یشدیم.C ها در زبا م

گ‌ر واقع همان Go. نیست C در این است که برای اعمال سطح پایین دیگر نیازی به Goخوبی مدرن است، ازC د را به شما معرفی کرده بودند! Unix و Cطرف همان کسانی که روزی

گ‌هی هایی برای عملیات ریاضی، زمان و تاریخ، محیط سیستمPackage های بال را همراه کنید با Packageهمگ‌هها، پردازش و کردن متن و . . . .Parseعامل، پایگاه داده، ورودی و خروجی، رشت

گ‌هی استاندارد با یک گ‌یتوان آن را با HTTP Serverدر ضمن، کتابخان یاNginx داخلی همراه است که به راحتی مNode.js گ‌نها اشاره شد هم از همین گ‌تهایی که در ابتدای این نوشته به آ Server مقایسه کرد. در واقع، اکثر سای

گ‌یکنند. گ‌نشان استفاده م داخلی برای خدمات رسانی به کاربرا

گ‌هی استاندارد گ‌هنویسی وب را برای شماTemplate Engine یک سیستم Goهمچنین در کتابخان ارایه شده تا برنامگ‌هنویسی وب در گ‌هاید که برای برنام ب ًل متوجه شد گ‌نتر کند. با این حساب، احتما ، نیاز چندانی بهGoآسا

گ‌هی استاندارد گ‌نهای دیگر نخواهید داشت. کتابخان گ‌کهای مرسوم در زبا گ‌مور همه چیز را از قبل برایتان مهیاGoفریکرده است!

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 50: go language

در جایگاه بسیار خوبی قرار دارد. در سایت زبان مستندات خوبی برای:Goاز نظر مستندات، شرو ع یادگیری زبان، •توضیح درباره ابزارهای موجود در زبان،•گ‌تهای آن،• توضیح عملکرد زبان و چگونگی کار با قابلیاسلیدها و ویدیو های آموزشی،••. . . .

گ‌یشان به طور کامل مستندت سازیPackageپیدا خواهید کرد. همچنین تمام ها و تک تک توابع و پارامترهاگ‌هاند. شد

گ‌هنویس هم اینچنین باشد!!!) دربایداگر زبان انگلیسی شما در حد مطلوبی قرار دارد (که به عنوان یک برنام با هیچ مشکلی مواجه نخواهید شد و نیاز به هیچ کتاب و منبع خاصی نخواهید داشت؛ چراGoزمینه یادگیری

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

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 51: go language

گ‌یگذرد، اما گ‌هی پایدار زبان نم ابزارهای جانبی نسبتب ًا کاملی در اختیار دارد:Goبا اینکه زمان زیادی از انتشار نسخ

هاPackage را آسان کرده است. این ابزار حتی قابلیت این را دارد که Package که کار کامپایل و نصب goابزارگ‌تهایی مثل دریافت و نصب نماید!githubرا به صورت اتوماتیک از سای

را به صورت محلی در کامپیوتر شما اجرا کند! سایت اصلیgolang.org قادر است سایت godocابزارgolang.org هم به کمک همین ابزار در حال اجراست. همچنین godoc گ‌یتواند مستندات مربوط به Package م

گ‌نها را مستقیمب ًا در ترمینال نمایش دهد. ها و توابع آ

گ‌یتوانند استایل gofmtابزار گ‌یکند. برای مثال هر کدام از اعضای تیم م استایل کدنویسی شما را مدیریت م برای یکپارچه کردن استایل کدهای پروژه استفادهgofmtکدنویسی خودشان را داشته باشند، اما در نهایت از

کنند.

ها طراحی شده. این ابزار با بررسی کدهای شما اطلعات موجودIDE هم برای کمک به ادیتورها و gocodeابزار گ‌نها را استخراج کرده و در اختیار ادیتورها و گ‌یتوانند از این اطلعات برایIDEدر آ گ‌نها هم م گ‌یگذارد. آ ها م

گ‌هسازی قابلیت استفاده نمایند.Autocompletionپیاد

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 52: go language

گ‌هنویس ویرایشگر متن است. خوشبختانه از پشتیبانی خوبی در این زمینه برخوردارGoمهمترین ابزار کار هر برنام و … به صورتGedit و BBEdit و Notepad++ و Kate از Goاست. در رابطه با ویرایشگرهای ساده و سبک،

گ‌یکند. رسمی پشتیبانی م

گ‌یکنند، گ‌های کدنویسی م پشتیبانی رسمی و کاملی را برای ویراشگرهایGoبرای کسانی که با ویراشگرهای حرفگ‌ر واقع از آنجایی که تیم سازندگان Emacs و Vimبی رقیب گ‌هی کاربری آن نیزGo ارائه کرده است. د و اکثر جامع

گ‌یکنند، پشتیبانی از این دو از اولویت بسیار بالیی برخوردار است. با همین ابزارها کدنویسی م

گ‌نهای کامپایلری نیاز خاصی به وجود Goدر حس نخواهید کرد؛ اما برای کسانی که کار باIDE همانند دیگر زباIDE ،گ‌یدهند برخوردار است.IntelliJ و Eclipse های IDE از پشتیبانی مناسبی برای Go ها را ترجیح م

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 53: go language

»Go] گ‌یشین، این نوشته زبان جذابیه، و همونطوری که از ب ًل جداگانه دارن و ما در حال رقابت با Rust و Go] متوجه م Go دو هدف کام

» داشته.Rust ساخته تأثیر زیادی روی Rob Pikeنیستیم. زبانی که

pcwaltonگ‌هنویسی زبان Rustاز اعضای تیم برنام

گ‌هایی که در متن بال به آن اشاره شده گ‌تهای وبلگ شخصی مربوطنوشت در آن توضیح داده به چه دلیلی سادگی وPike است که Rob Pike به یکی از پسگ‌نهای دیگر را در Goمینیمال بودن گ‌تهای رایج در زبا قرار نداده.Go براش مهم بوده و چرا خیلی از قابلی

http://commandcenter.blogspot.com.com/2012/06/less-is-exponentially-more.html

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 54: go language

ه‌تهای نداشته، قابلیت اصلی زبان Goقابلی

گ‌هنویسان گ‌بالمثل جالبی وجود دارد:Goدر اجتما ع برنام ضرگ‌تها را ندارد! »Go« مهمترین قابلیت این است که خیلی از قابلی

گ‌نها درGoطراحان گ‌هاند. موضع آ گ‌نهای دیگر را در این زبان قرار نداد گ‌تهای موجود در زبا تعداد زیادی از قابلیگ‌هی گ‌نها فلسف گ‌نباره بسیار رادیکال است و با کسی تعارف ندارند! آ گ‌هاند و به شدت تأکید دارندCای را در پیش گرفت

اضافه نخواهند کرد. Goتا زمانی که یک قابلیت «واقعا» مورد نیاز نباشد، چیزی را به

گ‌هی جدیدی که از گ‌نهای دیگر، در هر نسخ گ‌یشود باGoاین یعنی انتظار نداشته باشید که مانند زبا منتشر مگ‌تهای جدید مواجه شوید. این افراد از دنیای گ‌نها داشتید؟C و Unixانبوهی از قابلی گ‌هاند، آیا انتظار دیگری از آ آمد

گ‌تهایی که هر از چند ماه به آنGoطراحان گ‌هنویسان باید به خود زبان باشد نه قابلی معتقدند که تمرکز برنامگ‌یشود! گ‌یهای زیادی در لزم به ذکر است کهاضافه م گ‌هساز گ‌یگیرد.Go از نظر زیرساختی هر روز بهین صورت م

سال هنوز در حال۴۰ بعد از گذشت C است. حتی کامپایلرهای زبان Native یک زبان Goیادتان باشد که توسعه هستند!

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 55: go language

اه‌تهایی که در وجود ندارند:Goلیستی از قابلیگ‌هگان گ‌تها را به زبان اضافه نکرده اند و دلیل مناسبی هم برای کارشانقصد از Goدقت کنید که سازند گ‌ن قابلی ای

ب ًل یادارند. گ‌هنویسی در اصو گ‌هاند یا اینکه شیوه برنام گ‌هتر و بهتری را ارائه کرد گ‌شهای ساد گ‌نها رو بهGo به جای آگ‌تها نیاز ندارد: طریقی است که به این قابلی

گ‌سها کلوراثت ) گ‌هها و مخرب ها )Constructors & Destructorsسازند ) گ‌هگرها )Pointer Arithmeticمحاسبات اشار ارجا عthis

) گ‌تها )Templatesتمپل ) استثناهاExceptions( ) سربارگذاری متدهاMethod Overloading( ) سربارگذاری عملگرOperator Overloading( ....گ‌ت ریز و درشت دیگر و چندین قابلی

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 56: go language

Go ه‌هنویسی بهترین زبان برنام

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 57: go language

نیست!

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 58: go language

گ‌یهای صحبت کردیم؛ اما آیا واقعب ًا ممکن است که یک زبان هیچ نقطه ضعفیGoتا الن فقط در مورد خوبنداشته باشد؟ مسلمب ًا خیر...

گ‌فهای ب ًلGoنقطه ضع گ‌هگان زبان کام گ‌فهایی هستند که سازند از دو زاویه قابل بررسی است. در زاویه اول نقطه ضعگ‌فهایی هستند که گ‌نها کار شود. در زاویه دوم نقطه ضع گ‌نها آگاهی داشته و قبول دارند که باید بیشتر روی آ به آ

گ‌هی کاربری گ‌هنویسانی که قصد مهاجرت ازGoدر جامع گ‌یشود! اما برنام به عنوان نقاط قوت به آن نگریسته مگ‌نها مشکل پیدا کنند. گ‌نهای دیگر را دارند، ممکن است با آ زبا

Garbage و سیستم Runtime به علت داشتن سیستم Go است! C با زبان Goنقص اول تفاوت سرعت

Collector گ‌چوقت توانایی برابری با تا این اندازهC را نخواهد داشت. اینکه چرا C، حداقل به صورت تئوری هیگ‌هایی دارد. سریع است، خود نیاز به بحث جداگان

فقط قادر است کدهای «مناسب» تولید کند، نه کدهای «سریع»! به این معنی کهGoدر حال حاضر کامپایلر گ‌یدهد. البته توجه کنید که تولیدGoکامپایلر گ‌ی خاصی را روی کدهای نهایی انجام نم گ‌هساز گ‌هی فعلی بهین در نسخ

ب ًل کار راحتی نیست. در این زمینهGo مانند Nativeکد ماشین روی چندین پلتفرم مختلف برای یک زبان اصگ‌ههای زبان داد. گ‌هدهند باید کمی صبر کرد و فرصت بیشتری به توسع

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 59: go language

گ‌یشود. اگر بخواهیم Go فراموش نکنید که گ‌نهایی مانندGo در حال حاضر هم یک زبان سریع محسوب م را با زباPython یا Ruby یا PHP گ‌نها مقایسه کنیم، تجربه ثابت کرده است که برابر50 تا 20 بین Go و یا امثال آ

گ‌یکند! گ‌عتر عمل م سری

گ‌نها کندتر عمل کند. در چنین حالتی، مطمئنGoالبته موارد زیادی وجود دارد که دیده شده به نسبت این زباگ‌نهایی برای حل مشکلCباشید که آن عملیات در پشت صحنه توسط کدهای اجرا شده است. در چنین زبا

گ‌لها را در گ‌یدهند. Cسرعت، بسیاری از ماژو توسعه م

گ‌نهایی مثل Goاگر بخواهیم گ‌یتوانیم با قطعیت نظری را مطرح نماییم.C یا #Java را با زبا مقایسه کنیم، نمMicrosoft و Oracle همان) SUNگ‌هی گ‌نها دلر از سرمایه خود را برای توسع سابق) میزان زیادی از وقت و میلیو

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

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

گ‌یتوان گفت که از گ‌نها ابراز نظر کرد. اما با جرأت م گ‌یتوان به صورت مطلق درباره سرعت آ گ‌نها. واقعب ًا نم کندتر از آگ‌مها عمل کند!!! 10 ثابت کرده که ممکن است حتی تا Goنظر میزان مصرفی حافظه، گ‌هتر از این پلتفر برابر بهین

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 60: go language

گ‌هسازی های زیادی در آن اعمالGoمطلب مهم این است که به شدت در حال توسعه است و تقریبب ًا هر روز بهینگ‌یشود. حال که گ‌هسازی زبان شرو عGoم به وضعیت ثبات رسیده است، تازه تیم توسعه کار خود را در زمینه بهینگ‌هی زبانConcurrent اعلم کرده که بعضی از کدها (مخصوصب ًا کدهای Pike ،کرده. برای مثال گ‌هی آیند ) در نسخ

) Go1.1 گ‌لکرد بهتری خواهند داشت!۵۰ ) تا درصد عم

گ‌ه تأثیر گذار باشد، که یکی از طرفی، سرعت یک معیار مطلق نیست. خیلی از مسایل ممکن است بر سرعت برنامگ‌یکند. شما هم به هنگام انتخاب گ‌مهایی است که انتخاب م گ‌شها و الگوریت گ‌هنویس و رو گ‌نها خود برنام از مهمترین آ

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

داد تا کارشان را انجام دهند.

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 61: go language

بیت). دلیل۶۴ طراحی شده بود (x64 در ابتدا برای معماری Go است. Garbage Collectorنقص دیگر، سیستم گ‌مهای گ‌مهای ۳۲آن هم این بود که چون پلتفر بیتی هستند، تیم۶۴ بیتی کم کم در حال جایگزین شدن با پلتفر

گ‌مهای بیتی معطوف کرده بود.۶۴توسعه تمام توجه خود را به پلتفر

بیت) که۳۲ با یک نقص فنی روبرو است (x86 روی معماری Garbage Collectorمتاسفانه در حاضر سیستم گ‌یتواند باعث کرش کردن برنامه شود! البته این مشکل فقط برای معماری موارد معدودیدر است و اگرx86 م

گ‌هها را روی معماری اجرا کنید با مشکلی مواجه نخواهید شد. از همین رو توصیه شده است تا زمانx64برنامگ‌مهای گ‌ههای خود را فقط روی سیست بیتی اجرا کنید. ۶۴برطرف کردن این مشکل، برنام

گ‌هی بعدی این است که در حال حاظر سیستم گ‌مهای Runtimeنکت ۱۶ بیتی، فقط توانایی استفاده از ۶۴ روی پلتفر

گ‌ههایی که به صورت پیوسته به (به طور متوالی)گیگابایت حافظه را دارد گیگابایت حافظه۱۶. خیلی نادر اند برنامگ‌کتری تقسیم کنید تا این، اما نیاز داشته باشند گ‌تهای کوچ گ‌هی خود را به قسم در صورت نیاز، باید برنام

محدودیت را دور بزنید.

گ‌هی گ‌هGoدر مخزن توسع گ‌مهای GCایی برای رفع مشکل ه، اصلحی بیتی وجود دارد، و میزان۳۲ در سیست گیگابایت افزایش داده شده است. به احتمال بسیار زیاد این۱۲۸به نیز Runtimeگسترش حافظه برای سیستم

گ‌هی قرار خواهند گرفت.زبان ۱.۱اصلحیه ها در نسخ

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 62: go language

گ‌هنویسان ایرانی مشکل ساز است!! کمی به اسم این این زبان دقت کنید: Goنقص بعدی خصوصا برای برناماسم این زبان کمی غلط انداز است!! و شاید نتوان خیلی راحت اسم آن را به زبان آورد!!!! :-)

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

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

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

گ‌هی گ‌یکنید)Erlang(به همان شکلی که به عنوان نام زبان استفاده کنید. Golangاست از واژ را تلفظ م

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 63: go language

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

از تجربه و تخصص در علوم کامپیوتری نیاز دارد.

گ‌نهایی مثل ب ًل با طرز کار C یا Goدر زبا ، و مباحث سطح پایین مربوط بهI/O ، حافظه ، CPU ، تا زمانی که کامگ‌یتوانید براحتی با زبان ارتباط برقرار کنید. شاید بتوانید به دلیل سادگی زبان آن را هرکدام آشنا نباشید، نم

گ‌هنویس براحتی یاد بگیرید، اما آگاهی شما از زبان همیشه در حد پایینی قرار خواهد داشت. در حالی که یک برنامRuby گ‌چوقت نیاز نداشته باشد تا از ها سر در بیاورد!Register ممکن است هی

گ‌تهای گ‌شزمینه ی مناسبی برخوردار باشید. اینطور نیستConcurrencyخصوصب ًا برای استفاده از قابلی باید از پیگ‌هی شما روی یک گ‌هنویسی در این زبان، اطمینان پیدا کنید که برنام گ‌هاییCPUکه به صرف برنام شانزده هست

گ‌هنویسی گ‌عتر اجرا خواهد شد! برنام گ‌هی کافی است.Concurrentشانزده برابر سری گ‌هی زیاد و تجرب نیازمند مطالعGo !گ‌یکند برای شما معجزه نم

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 64: go language

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

گ‌هی گ‌ههای ساده، ازGoبرای مثال، تیم توسع گ‌هاند که استفاده از کتابخان و اجتما ع کاربری آن همیشه عنوان کردگ‌کها یکی از عوامل اصلی در پیچیده گ‌مور گ‌گ‌کها برخوردار است؛ و اینکه فری گ‌مور اولویت بسیار بالتری نسبت به فری

گ‌نها استفاده کنید بهتر است! و یا اینکه گ‌یباشند و هر چه کمتر از آ یکی ازAndrew Gerrandشدن پروژه مگ‌یکند چقدر از اینکه گ‌مورک هایی مثل Goاعضای اصلی تیم توسعه در اکانت تویتر خود اعلم م یاDjango فری

Rails!!!گ‌چوقت هم نداشته باشد ندارد خوشحال است و امیدوار است که هی

گ‌هاند چنین نظراتی کمی گ‌کها عادت کرد گ‌مور گ‌نهای دیگر که به کار با فری گ‌هنویسان زبا مسلمب ًا برای خیلی از برنامگ‌هی Goعجیب و غریب است! در حکم فرما است. جای تعجبی هم ندارد، چون این افراد خودشانUnix فلسف

هستند!Unixخالق

گ‌یدهند؛ در صورت نیازUnixدر فلسفه باید از ابزارهای کوچکی استفاده کرد که هر کدام کار مشخصی انجام مگ‌مورک ها به عنوان گ‌تهای کوچک، ابزار بزرگتری را ایجاد کرد. فری گ‌یتوان با کنار هم قرار دادن این قسم م

گ‌هی ب ًل در جبهه مخالف فلسف گ‌یکنند، عم گ‌ه را توصیه م قرارUnixسیستمی که ابزارهای یکپارچه و غیرقابل تجزیدارند.

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 65: go language

گ‌یشوند که چرا گ‌هنویسان تازه وارد متوجه نم ها و متدهاClass و توابع را جایگزین Type کار با Goخیلی از برنام ندارد... چرا از سربارگذاری توابع پشتیبانیExceptionکرده... چرا وراثت را از زبان حذف کرده... چرا این زبان

گ‌هها سؤال دیگر... گ‌یکند... و د نم

گ‌نها بعد از مدتی که با گ‌آ گ‌نها هم مانندGoاما تقریبب ًا اکثر گ‌ آ گ‌هاند که ای کاش زبان پیشین گ‌هاند، عنوان کرد کار کردGo گ‌هنویسان نباید در گ‌هسازی شده بود! برنام گ‌هی Go پیاد گ‌هی Java به شیو Python کدنویسی کنند... نباید به شیو

کدنویسی کنند... و یا هر زبان دیگری...

اه‌هی Goدر اه‌هنویسی کرد!Go باید به شیو برنام

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 66: go language

از کجا شروع کنم؟

بروید. ابتدا پکیج مربوط به سیستم عامل خود را دانلود و نصب نمایید. برایgolang.orgمستقیم به سایت گ‌هبندی شده است. برایDocumentsخواندن مستندات هم به قسمت سایت بروید. این قسمت بسیار جالب دست

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

گ‌یافتد اطل ع پیدا کنید: حتمب ًا عضو گروه کاربری زبان شوید تا از بحث و اخباری که روزانه در آن اتفاق م

https://groups.google.com/group/golang-nuts

را در تویتر دنبال کنید:golangدر ضمن، یادتان نرود که تگ مخصوص به

https://twitter.com/#!/search/realtime/%23golang

گ‌لپلس:golangو همچنین تگ مربوط به در گوگ

https://plus.google.com/s/%23golang

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 67: go language

هر از چند گاهی هم به وبلگ رسمی زبان سر بزنید:

blog.golang.org/

را هم از یاد نبرید:reddit در سایت golangمطالب مربوط به درگاه

reddit.com/r/golang/

امیررضا قادری– Goمعرفی زبان برنامه نویسی

Page 68: go language

گ‌هایم. خوب، به پایان این نوشته رسیدگ‌هی مناسبی را برای یادگیری زبان گ‌شزمین فراهم کنم.Goامیدوارم که توانسته باشم پی

با تشکر از وقتی که برای خواندن این نوشته در نظر گرفتید.

«امیررضا قادری»

امیررضا قادری– Goمعرفی زبان برنامه نویسی