آرایه

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

var arrayName [size] datatype

arrayName که نام آرایه را نشان می‌دهد. هنگام نامگذاری آرایه بهتر است که نام آرایه نشان دهنده نوع آرایه باشد. به عنوان مثال برای نامگذاری آرایه‌ای که اعداد را در خود ذخیره می‌کند از کلمه number استفاده کنید. size اندازه آرایه را مشخص می کند و به کامپایلر می‌گوید شما قصد دارید چه تعداد داده یا مقدار را در آرایه ذخیره کنید. Datatype نوع داده‌هایی را نشان می‌دهد که آرایه در خود ذخیره می‌کند. برای تعریف یک آرایه که 5 مقدار از نوع اعداد صحیح در خود ذخیره می‌کند باید به صورت زیر عمل کنیم :

var numbers [5] int

در این مثال 5 آدرس از فضای حافظه کامپیوتر شما برای ذخیره 5 مقدار رزرو می‌شود. حال چطور مقادیرمان را در هر یک از این آدرسها ذخیره کنیم؟ برای دسترسی و اصلاح مقادیر آرایه از اندیس یا مکان آنها استفاده می‌شود.

numbers[0] = 1
numbers[1] = 2
numbers[2] = 3
numbers[3] = 4
numbers[4] = 5

اندیس یک آرایه از صفر شروع شده و به یک واحد کمتر از طول آرایه ختم می‌شود. به عنوان مثال شما یک آرایه 5 عضوی دارید، اندیس آرایه از 0 تا 4 می‌باشد چون طول آرایه 5 است پس 1-5 برابر است با 4. این بدان معناست که اندیس 0 نشان دهنده اولین عضو آرایه است و اندیس 1 نشان دهنده دومین عضو و الی آخر. برای درک بهتر مثال بالا به شکل زیر توجه کنید :
arrays-12-13-10-01
به هر یک از اجزاء آرایه و اندیسهای داخل کروشه توجه کنید. کسانی که تازه شروع به برنامه نویسی کرده‌اند معمولاً در گذاشتن اندیس دچار اشتباه می‌شوند و مثلاً ممکن است در مثال بالا اندیسها را از 1 شروع کنند. یکی دیگر از راه‌های تعریف سریع و مقدار دهی یک آرایه به صورت زیر است :

var arrayName = [size] datatype { val1, val2, ... valN };

در این روش شما می‌توانید فوراً بعد از تعریف اندازه آرایه مقادیر را در داخل آکولاد قرار دهید. به یاد داشته باشید که هر کدام از مقادیر را با استفاده از کاما از هم جدا کنید. همچنین تعداد مقادیر داخل آکولاد باید با اندازه آرایه تعریف شده برابر باشد. به مثال زیر توجه کنید :

var numbers = [5] int { 1, 2, 3, 4, 5 }

این مثال با مثال قبل هیچ تفاوتی ندارد و تعداد خطهای کدنویسی را کاهش می‌دهد. شما می‌توانید با استفاده از اندیس به مقدار هر یک از اجزاء آرایه دسترسی یابید و آنها را به دلخواه تغییر دهید. تعداد اجزاء آرایه در مثال بالا 5 است و ما 5 مقدار را در آن قرار می‌دهیم. اگر تعداد مقادیری که در آرایه قرار می‌دهیم کمتر یا بیشتر از طول آرایه باشد با خطا مواجه می‌شویم. نکته ای که بهتر است در اینجا به آن اشاره شود این است که طول آرایه ثابت و غیر قابل تغییر می باشد. به کد زیر توجه کنید:

package main

import "fmt"

func main() {

    var numbers = [5] int { 1, 2, 3, 4, 5 }
	
    numbers[5] = 6
	
    fmt.Println(numbers)

}

در کد بالا اگر بخواهیم عدد 6 را به آخر آرایه اضافه کنیم، با خطای out of bounds مواجه می شویم. چون ما در خط 6 گفته ایم که تعداد عناصر آرایه 5 است و در نتیجه کامپایلر اجازه اضافه کردن عنصر جدید را نمی دهد.

دستیابی به مقادیر آرایه با استفاده از حلقه for

در زیر مثالی در مورد استفاده از آرایه‌ها آمده است. در این برنامه 5 مقدار از کاربر گرفته شده و میانگین آنها حساب می‌شود:

  1: package main
  2: 
  3: import "fmt"
  4: 
  5: func main() {
  6: 
  7:     var numbers [5] int
  8:     var total       int = 0
  9:     var average     float32
 10:     var i           int
 11: 
 12:     for  i = 0; i < len(numbers); i++ {
 13:         fmt.Print("Enter a number: ")
 14:         fmt.Scanln(&numbers[i])
 15:     }
 16: 
 17:     for i = 0; i < len(numbers); i++ {
 18:         total += numbers[i];
 19:     }
 20: 
 21:     average = (float32(total / len(numbers)))
 22: 
 23:     fmt.Printf("Average = %.2f", average)
 24: 
 25: }
Enter a number: 90
Enter a number: 85
Enter a number: 80
Enter a number: 87
Enter a number: 92
Average = 86

در خط 7 یک آرایه تعریف شده است که می‌تواند 5 عدد صحیح را در خود ذخیره کند. خطوط 8 و 9 متغیرهایی تعریف شده‌اند که از آنها برای محاسبه میانگین استفاده می‌شود. توجه کنید که مقدار اولیه total صفر است تا از بروز خطا هنگام اضافه شدن مقدار به آن جلوگیری شود. در خطوط 12 تا 15 حلقه for برای تکرار و گرفتن ورودی از کاربر تعریف شده است. از متد طول (()len) آرایه برای تشخیص تعداد اجزای آرایه استفاده می‌شود. اگر چه می‌توانستیم به سادگی در حلقه for مقدار 5 را برای شرط قرار دهیم ولی استفاده از خاصیت طول آرایه کار راحت‌تری است و می‌توانیم طول آرایه را تغییر دهیم و شرط حلقه for با تغییر جدید هماهنگ می‌شود. در خط 14 ورودی دریافت شده از کاربر در آرایه ذخیره می‌شود. اندیس استفاده شده در number (خط 14) مقدار i جاری در حلقه است. برای مثال در ابتدای حلقه مقدار i صفر است بنابراین وقتی در خط 14 اولین داده از کاربر گرفته می‌شود اندیس آن برابر صفر می‌شود. در تکرار بعدی i یک واحد اضافه می‌شود و در نتیجه در خط 14 و بعد از ورود دومین داده توسط کاربر اندیس آن برابر یک می‌شود. این حالت تا زمانی که شرط در حلقه for برقرار است ادامه می‌یابد. در خطوط 19-17 از حلقه for دیگر برای دسترسی به مقدار هر یک از داده‌های آرایه استفاده شده است. در این حلقه نیز مانند حلقه قبل از مقدار متغیر شمارنده به عنوان اندیس استفاده می‌کنیم.

هر یک از اجزای عددی آرایه به متغیر total اضافه می‌شوند. بعد از پایان حلقه می‌توانیم میانگین اعداد را حساب کنیم (خط 21). مقدار total را بر تعداد اجزای آرایه (تعداد عددها) تقسیم می‌کنیم. برای دسترسی به تعداد اجزای آرایه می‌توان از خاصیت length آرایه استفاده کرد. توجه کنید که در اینجا ما حاصل از تقسیم را به float32 تبدیل کرده‌ایم بنابراین نتیجه عبارت یک مقدار از نوع float32 خواهد شد و دارای بخش کسری می‌باشد. خط 23 مقدار میانگین را در صفحه نمایش چاپ می‌کند. طول آرایه بعد از مقدار دهی نمی‌تواند تغیر کند. به عنوان مثال اگر یک آرایه را که شامل 5 جز است مقدار دهی کنید دیگر نمی‌توانید آن را مثلاً به 10 جز تغییر اندازه دهید. البته تعداد خاصی از کلاسها مانند آرایه‌ها عمل می‌کنند و توانایی تغییر تعداد اجزای تشکیل دهنده خود را دارند. آرایه‌ها در برخی شرایط بسیار پر کاربرد هستند و تسلط شما بر این مفهوم و اینکه چطور از آنها استفاده کنید بسیار مهم است.