گو (زبان برنامه‌نویسی)

گو یک زبان برنامه‌نویسی ترجمه‌شده و دارای زباله جمع‌کن و همروند است که در شرکت گوگل و توسط رابرت گریسمر، راب پایک و کن تامپسون توسعه داده می‌شود.
این زبان در نوامبر ۲۰۰۹ معرفی شد و در حال حاضر در چند سامانه اجرایی گوگل استفاده می‌شود. مترجم گو از لینوکس، مک او اس، ویندوز و انواع سیستم‌های عامل بی‌اس‌دی مانند FreeBSD پشتیبانی می‌کند. از لحاظ معماری پردازنده نیز، معماری ایکس۸۶، معماری ایکس۶۴، معماری آرم و معماری POWER که مخصوص به شرکت آی‌بی‌ام است، توسط مترجم گو پشتیبانی می‌شوند.
“go”به عنوان یک آزمایش توسط مهندسان گوگل رابرت گریزمر، راب پایک و کن تامپسون، برای طراحی یک زبان برنامه‌نویسی جدید طراحی شده‌است که انتقادهای رایج زبانهای دیگر را در حالی که ویژگی‌های مثبت خود را حفظ می‌کند، ایجاد می‌کند. زبان جدید شامل ویژگی‌های زیر بود:
به صورت ایستا نوشته شده، مقیاس پذیر به سیستم‌های بزرگ (به عنوان جاوا و C ++)
نیاز به محیط‌های توسعه یکپارچه ندارند، اما از آن‌ها حمایت می‌کنند پشتیبانی از شبکه و چند پردازش
اهداف ایجاد
اهداف ایجاد زبان گو شامل موارد زیر است:
کارایی زبان‌های ترجمه‌شده دارای سامانه نوع ایستا، و آسانی برنامه‌نویسی زبان‌های پویا
امنیت نوع‌ها، و امنیت حافظه
پشتیبانی برای همروندی و ارتباط
زباله جمع‌کن کارا، و بدون تاخیر
زمان ترجمه کوتاه
طراحی زبان
“go” به‌طور قابل توجهی در سنت C است، اما باعث تغییرات بسیاری می‌شود که به منظور شفافیت، سادگی و ایمنی ایجاد می‌شود:
یک روش نحوی و محرک پذیرش الگوهای رایج در زبانهای پویا:
· توصیف اولیه متغیر مختصر و اولیه از طریق استنتاج نوع ( x := 0 not int x = 0; or var x = 0; ).
زمان تدوین سریع
مدیریت بسته‌های از راه دور (به دست آوردن) و مستندات بسته آنلاین.
رویکردهای متمایز به مشکلات خاص:
ابتکارهای همپوشانی ساخته شده: فرایندهای سبک وزن (goroutines)، کانال‌ها و بیانیه انتخاب.
یک سیستم رابط به جای ارث مجازی، و نوع جایگذاری به جای ارثی غیرمجازی.
یک toolchain که به‌طور پیش‌فرض باینری‌های بومی را بدون وابستگی‌های خارجی تولید می‌کند
شی‌گرایی
در زبان گو، ارث‌بری نوع‌ها وجود ندارد. در این زبان، می‌توان برای هر نوع داده‌ای، حتی برای نوع‌های داخلی، مثل اعداد صحیح فاقد بسته‌بندی، تابع عضو تعریف کرد، و این عمل محدود به ساخت‌ها (رده‌ها) نمی‌شود.
در زبان گو از رابط‌ها می‌توان برای تعریف رفتار یک شی استفاده کرد. هر رابط مجموعه‌ای از تعریف توابع است، و هر نوعی که توابع این رابط را داشته باشد، این رابط را پیاده‌سازی کرده‌است.
در نمونه زیر، یک رابط تعریف شده‌است که یک تابع به نام Abs و نوع خروجی float64 مشخص کرده‌است. هر نوعی که این تابع را پیاده‌سازی کند، در واقع این رابط را پیاده‌سازی کرده‌است. به عنوان نمونه، هم MyFloat و هم Vertex این چنین هستند.
type Abser interface {
Abs() float64
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f <0 {
return float64(-f)
return float64(f)
type Vertex struct {
X, Y float64
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4
a = f // a MyFloat implements Abser
fmt.Println(a.Abs())
a = v // a Vertex implements Abser
fmt.Println(a.Abs())
همروندی
گوروتین تابعی است که به صورت همروند با بقیه گوروتین‌ها در فضای حافظه یکسان اجرا می‌شود. گوروتین‌ها معادل با ریسمان‌های سیستم‌عامل نیستند، بلکه چندین گوروتین بین چندین ریسمان سیستم‌عامل تسهیم می‌شوند.
برای ایجاد یک گوروتین، قبل از فراخوانی تابع، عبارت go را استفاده می‌کنیم. در نمونه زیر، یک گوروتین به‌صورت همروند با گوروتین فعلی ایجاد و اجرا می‌شود:
go list.Sort() // run list.Sort concurrently; dont wait for it.
گوروتین‌ها برای تبادل داده از کانال‌ها استفاده می‌کنند. در نمونه زیر، یک کانال به نام c ایجاد می‌شود که برای مشخص کردن تکمیل اجرای گوروتین داخلی استفاده می‌شود:
c := make(chan int) // Allocate a channel.
// Start the sort in a goroutine; when it completes, signal on the channel.
go func() {
list.Sort()
c <- 1 // Send a signal; value does not matter.
doSomethingForAWhile()
<-c // Wait for sort to finish; discard sent value.
ابزارهای زبان
زبان گو شامل همان نوع اشکال زدایی و تست است که در بسیاری از زبان ای توزیع شده دیگر هم استفاده می‌شود.
go fmt ،برای قالب بندی کد
go get ،برای بازیابی و نصب بسته‌های از راه دور
go vet ،یک تحلیلگر استاتیک به دنبال خطاهای احتمالی در کد
go run ،یک میانبر برای ساخت و اجرای کد
godoc ،برای نمایش اسناد یا ارائه آن از طریق HTTP
gorename ،برای تغییر نام متغیرها، توابع و غیره
مثال‌ها
برنامه Hello World
مثال زیر برنامه Hello World را در گو پیاده‌سازی می‌کند:
package main
import "fmt"
func main() {
// a first program in go
fmt.Println("Hello, World")
برنامه Echo
مثال زیر چگونگی نوشتن برنامه‌ای مشابه فرمان echo یونیکس را در گو نشان می‌دهد:
package main
import (
"os"
"flag" // Command line option parser.
var omitNewline = flag.Bool("n", false, "dont print final newline")
const (
Space = " "
Newline = "\n"
func main() {
flag.Parse() // Scans the arg list and sets up flags.
var s string
for i := 0; i 0 {
s += Space
s += flag.Arg(i)
if !*omitNewline {
s += Newline
os.Stdout.WriteString(s)
انتقادها
منتقدان زبان گو می‌گویند:
فقدان ژنریکهای زمان کامپایل منجر به تکرار کپی می‌شود، metaprogramming نمی‌تواند به صورت ایستا بررسی شود و کتابخانه استاندارد نمی‌تواند الگوریتم‌های عمومی ارائه دهد.
فقدان گسترش زبان (از طریق، به عنوان مثال، بیش از حد اپراتور) باعث می‌شود تا وظایف خاص به صورت مقدماتی انجام شود.
عدم وجود سیستم نوع Hindley-Milner برای تایید ایمنی.
پروژه‌هایی که از زبان گو استفاده می‌کنند
برخی از برنامه‌های منبع باز قابل توجه در زبان گو:
CockroachDB, یک پایگاه داده منبع باز، قابل انعطاف و سازگار است.
Syncthing, یک نرم‌افزار کلاینت/سرور هماهنگ‌سازی فایل منبع باز است.
Snappy, یک مدیریت بسته برای Ubuntu Touch که توسط Canonical توسعه یافته‌است.
OpenShift, یک پلت فرم محاسبات ابری.
برخی از frameworkهای منبع باز قابل توجه در زبان گو:
Gorilla, یک ابزار وب برای گو.
Martini, بسته برای برنامه‌های وب کاربردی / خدمات.
Beego, یک framework وب با کارایی بالا در گو، برای برنامه‌های وب و سرویس‌های Backend مورد استفاده قرار می‌گیرد.
اختلاف نام‌گذاری
در روز ۱۰ نوامبر ۲۰۰۹، روز انتشار عمومی زبان، فرانسیس مک کیب، توسعه دهنده زبان برنامه‌نویسی !Go درخواست تغییر نام از زبان گوگل را برای جلوگیری از سردرگمی با زبان خود، که ۱۰ سال در حال توسعه آن است، کرد.
در ۱۲ اکتبر ۲۰۱۰، این مسئله توسط راس ککس (rsc@) توسعه دهنده گوگل با وضعیت سفارشی «متاسفانه» همراه با توضیح زیر بسته شد:
«بسیاری از محصولات و خدمات محاسباتی از نام Go استفاده می‌کنند. در ۱۱ ماه پس از انتشار ما، این شباهت نام کمترین میزان سردرگمی را بوجود آورده است.