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 استفاده می‌کنیم.

تابع init #

همانطور که گفتیم نقظه شروع برنامه ما تابع main است. اما اگر بخواهیم قبل از اجرای برنامه مقداری را ست کنیم و یا چیزی را لود کنیم، می توانیم در داخل تابع init اینکار را انجام دهیم. تابع init قبل از تابع main اجرا می شود

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

پس از اجرای کد. خروجی زیر را مشاهده می کنید.

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

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 استفاده کردیم و سایر کلماتی که داخل کد فوق دیدید به عنوان شناسه هستند. برای اطلاعات بیشتر در خصوص کلید واژه و شناسه لطفاً بخش کلید واژه و شناسه ها را مطالعه فرمایید.