مبانی زبان Go (بخش دوم) – توابع، شرطها، حلقهها و مدیریت خطا
در این بخش از آموزش زبان Go، میخوایم با مفاهیم پرکاربردی مثل توابع، شرطها، حلقهها و مدیریت خطاها آشنا بشیم. این مفاهیم بخش اصلی ساختار هر برنامهای رو تشکیل میدن و برای نوشتن کدهای پیچیدهتر خیلی مهم هستن.
توابع در Go بخشهای قابلاستفادهای از کد هستن که میتونن ورودیها رو پردازش کرده و خروجی بازگردونن. هر تابع میتونه ورودیهای مختلفی داشته باشه و یک یا چند مقدار رو به خروجی برگردونه.
تعریف تابع:
func add(x int, y int) int {return x + y}
در اینجا تابع add دو ورودی از نوع int داره و یک مقدار int بهعنوان خروجی برمیگردونه.
مقداردهی پیشفرض در ورودیها:
در Go میتونی از نوع دادهها استفاده کنی، ولی نیازی به مشخص کردن نوع برای پارامترهای مشابه نیست. مثل:
func add(x, y int) int {return x + y}
مقدار خروجی چندگانه:
Go به شما این امکان رو میده که چندین خروجی رو از یک تابع دریافت کنید:
func swap(x, y int) (int, int) {return y, x}
if و switchدستور if:
برای اجرای بخشهای مختلف کد بسته به شرایط مختلف میتونی از دستور if استفاده کنی. این دستور به شما این امکان رو میده که چک کنی آیا یه شرط برقرار هست یا نه.
if x > y {fmt.Println("x بزرگتر از y است")} else {fmt.Println("y بزرگتر از x است")}
دستور switch:
دستور switch در Go بسیار قدرتمند و انعطافپذیر هست. این دستور برای انجام بررسیهای مختلف روی یک متغیر خیلی مناسب و خوانا هست.
switch x {case 1:fmt.Println("مقدار 1")case 2:fmt.Println("مقدار 2")default:fmt.Println("مقدار غیر از 1 یا 2")}
در این مثال، Go مقدار متغیر x رو بررسی میکنه و بسته به مقدارش یکی از بخشها رو اجرا میکنه.
for و rangeحلقه for:
در Go، تنها حلقهای که داریم همون حلقه for است. این حلقه میتونه هم برای شمارش، هم برای پیمایش و هم برای حلقههای بیپایان استفاده بشه.
for i := 0; i < 5; i++ {fmt.Println(i)}
حلقه range:
حلقه range برای پیمایش روی آرایهها، اسلایسها، مپها و رشتهها استفاده میشه و به شما اجازه میده که بهصورت خودکار روی اونها تکرار داشته باشی.
arr := []int{1, 2, 3, 4}for index, value := range arr {fmt.Println(index, value)}
در Go، برخلاف زبانهای دیگه که از استثنا (Exceptions) استفاده میکنن، برای مدیریت خطاها از یک ساختار خاص به نام error استفاده میشه.
بررسی خطا:
در Go، وقتی از توابعی استفاده میکنید که ممکنه خطا تولید کنن، معمولاً خروجی خطا رو بهصورت یک متغیر برمیگردونن که باید بررسی بشه.
مثال:
package mainimport ("fmt""strconv")func main() {str := "123a"num, err := strconv.Atoi(str)if err != nil {fmt.Println("خطا در تبدیل رشته به عدد:", err)} else {fmt.Println("عدد تبدیلشده:", num)}}
در این مثال، تابع Atoi سعی میکنه رشته رو به عدد تبدیل کنه، ولی اگه چیزی غیر از عدد توش باشه، خطا تولید میکنه که باید بررسی بشه.
در Go، متغیرها در بلوکهای خاصی تعریف میشن و دسترسی به اونها محدود به همون بلوک هست. این یعنی هر متغیری که داخل یک تابع، شرط یا حلقه تعریف بشه فقط میتونه در همون بخش استفاده بشه.
مثال:
func testScope() {var x = 10if x > 5 {var y = 20fmt.Println(x, y)}fmt.Println(x) // مشکلی نداره// fmt.Println(y) // خطا: y در اینجا قابل دسترس نیست}
در اینجا، متغیر x در کل تابع testScope قابل دسترسه، ولی y فقط داخل بلوک if تعریف شده و نمیتونیم ازش بیرون استفاده کنیم.
در بخشهای بعدی به مفاهیم پیشرفتهتری مثل ساختار دادهها، کانالها و همزمانی میپردازیم. امیدوارم این بخش هم به شما کمک کرده باشه که کدهای Go رو بهراحتی بنویسید و مدیریت کنید.