توسعه برنامه وب Golang – انجمن DEV 👩💻👨💻

معرفی
Go یا Golang یک زبان برنامه نویسی با تایپ ایستا است که توسط گوگل در سال 2009 منتشر شد. این یک زبان برنامه نویسی Backend است که من از آن برای ساختن یک برنامه وب استفاده می کنم. دارای بسته ها و ویژگی های داخلی گسترده و همچنین قابلیت افزودن بسته های شخص ثالث است. برخی از این موارد عبارتند از net/http، که شامل توانایی گوش دادن به یک پورت، مسیریابی URL ها و ارائه مجدد محتوا است، html/قالب، که توانایی ایجاد قالب های Go را از صفحات HTML و داده های ارسال شده به صورت پویا دارد و پایگاه داده/sql، که امکان اتصال به پایگاه داده را فراهم می کند.
با استفاده از این بسته ها، یک توسعه دهنده می تواند یک برنامه وب در Go بسازد.
برو عالیه مستندات در مورد زبان و بسته های آنها، که من به شدت توصیه می کنم آنها را بررسی کنید.
در زیر، برخی از توانایی های ذکر شده در بالا، و همچنین برخی دیگر از “عجیب” های جالب در مورد Go را نشان خواهم داد.
ساختار
همه فایل ها باید با یک اعلان بسته در خط اول شروع شوند.
برای اجرای یک برنامه، به یک تابع اصلی مانند جاوا نیاز دارد main(String[] args)
روش.
package main
func main() {
// contents of the main function here
}
اعلامیه ها
از دیدگاه جاوا، بسیاری از Golang می تواند به عقب ظاهر شود. به عنوان مثال، در جاوا، اعلان به صورت زیر است:
برخلاف Go’s…
وقتی صحبت از ذهنیت «از آن استفاده کن یا از دستش بده» بسیار سختگیر است. اگر متغیر یا وارداتی اعلام شود اما استفاده نشود، باید حذف شود، در غیر این صورت کامپایل نمی شود.
در مورد اعلامیه ها، در اینجا چند نمونه از اعلان های رایج در Go آورده شده است.
اکنون، توسعهدهندگان میتوانند متغیرها را با استفاده از نحو بالا اعلام کنند، اما راههای دیگری نیز وجود دارد.
// declare with type
var myString string
// declare with implied type
var myString = "Hello world"
این مورد آخر فقط در داخل یک بلوک، مانند یک تابع، قابل استفاده است.
// declare with ':='
myString := "Hello world"
استفاده از بسته ها
برای وارد کردن بسته، به سادگی اعلام کنید import()
و بسته های وارد شده را در داخل پرانتز لیست کنید.
برای استفاده از توابع و متغیرها، نام بسته و به دنبال آن را بنویسید .
و نام چیزی که می خواهید
// For example
import (
"fmt"
)
fmt.Print("Hello World!")
به یاد داشته باشید، از آن استفاده کنید یا آن را از دست بدهید. فایل با واردات استفاده نشده کامپایل نخواهد شد.
برای وارد کردن بسته های شخص ثالث و همچنین سایر بسته های محلی، باید یک فایل go.mod ایجاد کنید. در خط فرمان تایپ کنید go mod init {{project name}}
برای ایجاد فایل go.mod.
حلقه ها
در حالی که زبانهایی مانند جاوا و جاوا اسکریپت حلقههای for، while، و do…while دارند، Go یکی دارد: حلقه for. کار با آن بسیار آسان است، اما راه های مختلفی برای استفاده از آن وجود دارد:
// The basic for loop:
for i := 0; i < 10; i++ {
}
// The foreach loop (slices and arrays):
for index, item := range mySlice {
}
// The foreach loop (maps):
for key, value:= range myMap {
}
// The foreach loop (channels):
for input := range myChannel {
}
// The while true loop:
for isTrue {
}
// The infinite loop:
for {
}
دسترسی داشته باشید
در جاوا، توسعه دهندگان ویژگی ها و متدها را به عنوان علامت گذاری می کنند خصوصی یا عمومی برای کنترل دسترسی Go همچنین به توسعه دهندگان اجازه می دهد تا هنگام صادرات بسته ها دسترسی را کنترل کنند، اما نه با عمومی یا خصوصی، اما با کیس اگر یک تابع یا متغیر با یک شروع شود حرف بزرگ، عمومی است. در غیر این صورت خصوصی است.
var privateString = "no one can see this"
var PublicString = "other packages can see this."
اشیاء (نوعی)
گولنگ یک نیست برنامه نویسی شی گرا زبان، اما امکان عملکردی مشابه ایجاد شی را فراهم می کند. این را می توان با اعلام انواع سفارشی، بر اساس ساخت، مخفف ساختار. توابع حتی می توانند داشته باشند گیرنده ها، آنها را مانند روش ها، ساختن (u *User)
در این مورد.
با گیرنده ها، تابع باید به متغیری از نوع تعریف شده در محل گیرنده متصل شود (u *User)
. در مثال بالا، باید متغیری از نوع User را اعلام کرد و تابع را از آن فراخوانی کرد.
var myUser User
myUser.WriteName
در عملکرد، گیرنده با متغیر ارجاع داده می شود u
.
آرایه ها و برش ها
همه ما با آرایه ها آشنا هستیم. در زبان هایی مانند جاوا، اندازه آرایه ها تنظیم می شود، در حالی که در جاوا اسکریپت، اندازه پویا است. گولنگ هر دو را دارد. آرایه ها دارای یک طول تنظیم شده است که نمی توان آن را تغییر داد. آ تکه شبیه یک آرایه است، اما طول آن متغیر است. آنها بسیار شبیه به نظر می رسند، اما با یک تفاوت کلیدی: مقدار در پرانتز در هنگام اعلام.
یک توسعهدهنده همچنین میتواند یک برش از محتوای یک آرایه/برش را با استفاده از مقادیر شاخص در براکتهای مربع برگرداند و همه عناصر را از اولین فهرست فهرستشده به آخرین فهرست (انحصاری) برگرداند. عدم وجود شاخص شروع به معنای شروع از 0 و عدم وجود شاخص پایانی به معنای پایان در آخرین عنصر (شامل) است.
// return elements at indexes [2,5)
newSlice := myArray[2:5]
// return elements at 2 to the end
newSlice := myArray[2:]
// return elements from the start to 5 (exclusive)
newSlice := myArray[:5]
اعداد تصادفی
یک اشکال بزرگ Golang تولید اعداد تصادفی آن است. با استفاده از ریاضی/رند بسته، یک سری مولد مقادیر تصادفی وجود دارد، اما همه آنها از یک دانه استفاده می کنند، بنابراین هر بار همان اعداد به همان ترتیب بازگردانده می شوند. برای مبارزه با این، توسعه دهنده باید یک دانه از خود اضافه کند. برای به دست آوردن یک دانه منحصر به فرد، توسعه دهندگان از تاریخ فعلی در زمان بسته، زیرا همیشه در حال تغییر است. بنابراین، هر بار یک دانه متفاوت.
rand.NewSource(time.Now().UnixMicro())
randomInt := rand.Intn(10)
// return a number [0, 10)
کارکرد
توابع در Go بسیار شبیه به جاوا و جاوا اسکریپت کار می کنند. اعلام با func
کلمه کلیدی، نام، پارامترها، بازگشت و در پرانتزها، عملکرد را بدهید.
func equals (arg1 int, arg2 int) bool {
return arg1 == arg2
}
جایی که Go جالب می شود با گیرنده ها است که در زیر صحبت شده است اشیاءو با قابلیت داشتن چندین مقدار بازگشتی.
اینها بعد از پارامترها در پرانتز قرار می گیرند. دستور بازگشت باید هر دو نوع فهرست شده را برگرداند، و زمانی که بازده در حال رسیدگی است، هر دو مقدار باید در نظر گرفته شوند.
func RandomString(x int, n int) (string, error)
// Handle string and error return values
output, err := util.RandomString(3, 3)
بسیار متداول است که توابع در Go چندین مقدار را برمیگردانند، یکی معمولاً an است error
، نوعی شبیه به استثناهای جاوا.
Golang با متغیرهای استفاده نشده کامپایل نمیشود، بنابراین اگر یک تابع دارای چندین مقدار بازگشتی باشد، اما توسعهدهندگان فقط به یکی اهمیت میدهند، چه کاری انجام میدهند؟ در این صورت توسعه دهندگان از _
شخصیت. این به این معنی است که “من می دانم که یک ارزش اینجاست، اما به آن اهمیتی نمی دهم.
// Ignore second return value
output, _ := util.RandomString(3, 3)
اشاره گرها
یکی از مواردی که باید مراقب آن بود، ارزش عبوری است. گولنگ است به طور کامل ارزش عبوری این بدان معنی است که هر مقداری که به عنوان آرگومان در یک تابع ارسال می کنید، در یک متغیر جدید در یک مکان جدید در حافظه کپی می شود.
به عبارت دیگر، متغیری که بهعنوان آرگومان ارسال میشود، توسط تابع تغییر نمیکند، زیرا تابع در حال دستکاری متغیری متفاوت در مکانی متفاوت از حافظه است.
این مقاله را بخوانید ارزش عبوری برای توصیف بهتر از آنچه که می توانم ارائه کنم.
توسعه دهندگان می توانند با استفاده از اشاره گرها با این امر مقابله کنند. در زیر، نشان میدهم که چگونه به یک تابع بگوییم که یک اشارهگر را انتظار داشته باشد و چگونه نشانگر متغیر را دریافت کند.
این *
قبل از اینکه یک نوع به Go بگوید انتظار یک اشاره گر به مقداری از نوع داده شده را داشته باشد.
// Make a function that expects a pointer to a string and returns a pointer to an intager.
func usePointer (s *string) *int
برای دریافت اشاره گر به متغیر، از &
کاراکتر قبل از متغیر
myString := "Hello World"
usePointer(&myString)
انواع مرجع
حالا که به شما گفتم که Go هست به طور کامل ارزش عبوری، اجازه دهید در مورد زمان هایی که اینطور نیست به شما بگویم.
Go واقعاً کاملاً ارزش عبوری است، اما برخی از انواع داده ها به عنوان انواع مرجع شناخته می شوند.
این مقاله از جانب اشاره گرها در این مورد صحبت می کند
اینها انواعی هستند که مستقیماً مقادیر را ذخیره نمی کنند (این همان کاری است که انواع مقادیر انجام می دهند)، اما در عوض نشانگرها را ذخیره می کنند. این بدان معناست که حتی اگر متغیر کپی شده باشد، همچنان یک اشاره گر به مقدار واقعی را در داخل خود نگه می دارد.
در مورد انواع مرجع، توسعه دهندگان نیازی به دریافت نشانگر از آنها ندارند، همانطور که آنها می کنند حاوی یک اشاره گر آنها را می توان به طور معمول استفاده کرد، بدون نیاز به اشاره گر!
مسیریابی
با استفاده از net/http بسته در main()
توسعه دهندگان می توانند URL ها را مسیریابی کنند.
http.HandleFunc("/URL", (func(res http.ResponseWriter, req *http.Request) {
// handle responce and requests for /URL here
}))
HanldeFunc به یک الگوی URL در یک رشته و یک تابع کنترل کننده نیاز دارد http.ResponseWriter
و *http.Request
مولفه های. تابع را می توان در فایل یا بسته دیگری ذخیره کرد، اما باید به درستی قالب بندی و وارد شود.
گزینه دیگر برای مسیریابی، ذخیره مسیرها در فایل یا بسته دیگری با استفاده از http.ServeMux است.
شما باید مطمئن شوید که متغیر Mux برای شنونده قابل دسترسی است (نگاه کنید به استماع) با عمومی کردن متغیر یا با ایجاد یک تابع عمومی که یک اشاره گر به متغیر Mux برمی گرداند.
Mux := http.NewServeMux()
Mux.HandleFunc("/URL", (func(res http.ResponseWriter, req *http.Request) {
// handle responce and requests for /URL here
}))
بازگشت الگوهای Go
توسعه دهندگان می توانند با استفاده از صفحات HTML الگوهای Go بسازند. آنها می توانند صفحات استاتیک ساده یا صفحات پویا پیچیده باشند. این موضوع برای این پست وبلاگ خیلی بزرگ است، اما من نحوه تجزیه و بازگرداندن فایل را در یک تابع دسته نشان خواهم داد (نگاه کنید به مسیریابی) با استفاده از html/قالب بسته بندی
t, _ := template.ParseFiles("templates/index.html")
t.Execute(res, nil)
به استفاده از _
و nil
، که یک اشاره گر به هیچ، مشابه (اگرچه نه یکسان) به است null
.
این res
متغیر مورد استفاده از نوع است http.ResponseWriter
، همان مورد در کنترل کننده پاسخ.
استماع
مهمترین بخش در توسعه اپلیکیشن وب، شنونده است. بدون آن، مهم نیست که برنامه چقدر پیشرفته است، بی فایده است. این نیز در یافت می شود net/http بسته بندی
این کار با یک دستور بسیار ساده در main()
تابع.
(این نمونه ها در پورت 3000 گوش می دهند)
اگر از http.HanldeFunc برای مسیریابی:
http.ListenAndServe(":3000", nil)
اگر از http.ServeMux برای مسیریابی:
mux := http.NewServeMux()
// list routing functions here
http.ListenAndServe(":3000", mux)
نتیجه
اینها برخی از اصول اولیه Golang با الف بوده است خیلی نمای کلی توسعه برنامه وب از اینکه برای خواندن این پست وبلاگ وقت گذاشتید متشکریم، و من می خواهم دوباره مستندات Golang را توصیه کنم. این یک ابزار عالی است. همچنین مقالات و ویدیوهای بی شماری در مورد توسعه اپلیکیشن وب وجود دارد. اونایی که خوندم و دیدم خیلی خوبن زمان و فداکاری می خواهد، اما خیلی پیچیده نیست (فقط یکی دیگر از مزایای Golang).