1.1 ساختار کد گو

1.1 ساختار کد گو

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

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

1.1.0 زبان برنامه نویسی #

یک زبان برنامه‌نویسی یک زبان مصنوعی انگلیسی است که برای بیان محاسباتی که توسط یک ماشین (مخصوصاً رایانه) قابل انجام است، طراحی شده‌است. زبان‌های برنامه‌نویسی برای ایجاد برنامه‌هایی به کار می‌روند که رفتار یک ماشین را مشخص می‌کنند، الگوریتم دقیق را بیان می‌کنند، یا روشی برای تعامل انسان و رایانه هستند. بسیاری از زبان‌های برنامه‌نویسی تعدادی قالب از ویژگی‌های نوشته شده دستوری یا نحو (syntax) و معناشناسی (semantics) دارند، چرا که رایانه‌ها دستورهای دقیقاً مشخص نیاز دارند. برخی توسط سند خصوصیات (specification document) تعیین شده‌اند (برای مثال یک استاندارد ISO)، در حالی که برخی دیگر دارای پیاده‌سازی غالبی می‌باشند[به نقل از ویکی پدیا].

1.1.1 پکیج #

هر برنامه‌ای که با ساختار گو ایجاد شده باشد، از پکیج(ها) ساخته شده است. درواقع زبان گو یک زبان بر پایه پکیج است. برخلاف برخی دیگر که بر پایه فایل هستند. این به‌این‌معنی است که به «مجموعه»ای از ابزارها اعم از ثابت‌ها، متغیرها و عملیات مختلف که زیرمجموعه یک نام تعریف می‌شوند، پکیج می‌گوئیم. تفاوتی ندارد در یک «فایل» یا «چند» فایل، بشرطی که ابتدای همگی package name باشد.

1.1.2 یک نمونه کد ساده زبان گو #

قبل از اینکه محتوای بدنه کد زیر را بررسی کنید بهتره نحوه کامنت گذاری کد در زبان گو آشنا شوید.

1.1.2.1 کامنت گذاری #

کامنت ها در زبان گو همانند زبان سی می باشد که با قرار دادن ۲ اسلش در ابتدای خط یا قرار دادن یک یا چند خط ما بین /* و */ ایجاد میشود.

1// کامنت عادی یک خطی
2
3/*
4بلاک کامنت برای نوشتن کامنت چند خطی
5*/

1.1.2.2 نمونه کد #

در پایین یک نمونه کد قرار دادیم که با کامنت هر کدام از بخش های بدنه کد گو را توضیح دادیم

 1package main // نام پکیج فایل سورس را مشخص می کند
 2
 3import "math/rand" // یک پکیج استاندارد ایمپورت شده
 4
 5const MaxRnd = 16 // یک ثابت تعریف شده است
 6
 7// تابع
 8func StatRandomNumbers(n int) (int, int) {
 9	var a, b int
10	for i := 0; i < n; i++ {
11		if rand.Intn(MaxRnd) < MaxRnd/2 {
12			a = a + 1
13		} else {
14			b++
15		}
16	}
17	return a, b
18}
19
20// تابع main اولین نقطه شروع اجرای کد شما می باشد که در این تابع سایر موارد تعریف می شود.
21func main() {
22	var num = 100
23	x, y := StatRandomNumbers(num)
24	print("Result: ", x, " + ", y, " = ", num, "? ")
25	println(x+y == num)
26}

سورس کد بالا را در فایلی با نام basic-code-element-demo.go ذخیره می کنیم و سپس با دستور زیر اجرا می کنیم تا خروجی کد فوق را ببینیم :

1$ go run basic-code-element-demo.go
2Result: 46 + 54 = 100? true

1.1.3 تابع main #

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

1// تعریف پکیج main
2package main 
3
4// تعریف تابع main
5func main() {
6	println("Hello GoFarsi!")
7}

1.1.4 اجرای کد #

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

1$ go run main.go
2Result: Hello GoFarsi!

دستور بالا ابتدا داخل پوشه temp سیستم شما یک فایل اجرایی را درست میکند و سپس آن فایل را اجرا میکند و در نهایت خروجی را به ما نشان میدهد. اگر شما بخواهید خروجی فایل اجرایی (executable) داشته باشید و سپس آن را اجرا کنید می‌توانید از دستور زیر استفاده کنید:

1$ go build main.go
2$ ./main
3Result: Hello GoFarsi!

اگر بخواهید برای خروجی فایل اجرایی اسمی در نظر بگیرید میتوانید از دستور زیر با پارامتر o- استفاده کنید.

1$ go build -o goFarsi main.go
2$ ./goFarsi
3Result: Hello GoFarsi!
دقت کنید اگر از سیستم عامل ویندوز استفاده میکنید بعد از وارد کردن اسم پسوند exe را نیز اضافه کنید.
برای راحتی و سرعت بخشیدن هنگام توسعه ما از دستور go run استفاده می‌کنیم.

1.1.5 بررسی syntax #

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

1package main 
2
3func main()
4{
5	println("not compiled")
6}

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

1$ go run main.go
2Result: 
3# command-line-arguments
4.\main.go:4:1: syntax error: unexpected semicolon or newline before {

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

1.1.5.1 استفاده از go fmt #

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

1$ go fmt main.go
2Result: 
3.\main.go:4:1: unexpected semicolon or newline before {

حالا فرض کنید کدی را نوشته اید و داخل کد شما فضای زیادی وجود دارد و اندازه tab ها و space ها مشخص نیست. به مثال زیر توجه کنید:

 1package main 
 2
 3func main(){
 4
 5
 6
 7	println("print line 1")
 8	
 9	
10	
11	
12println("print line 2")
13	
14	
15}

وقتی کدی شبیه کد بالا را دارید و از دستور go fmt استفاده میکنیم خروجی کد بالا به شکل زیر تغییر پیدا می‌کند:

1package main 
2
3func main() {
4
5	println("print line 1")
6	
7	println("print line 2")
8}
در برنامه فوق ما یکسری کلمات کلیدی نظیر package, import, const, func, var , for, if, else, return استفاده کردیم و سایر کلماتی که داخل کد فوق دیدید به عنوان شناسه می باشد. برای اطلاعات بیشتر در خصوص کلید واژه و شناسه لطفا بخش کلید واژه و شناسه ها را مطالعه فرمایید.