Go-Interview-Questions-And-Answers
🌱چه تایپ هایی مقدار zero آن ها nil هست؟
interfaces, slices, channels, maps, pointers and functions.
🌱تایپ های نوع Reference؟
Pointers, slices, maps, functions, and channels
🌱تایپ های نوع Aggregate؟
Array and structs
🌱چه وقت باید از پوینتر استفاده کنیم؟
1- تابعی که یکی از پارامترهای خود را تغییر میدهد
-وقتی تابعی را فراخوانی میکنیم که یک پوینتر را به عنوان پارامتر میگیرد، انتظار داریم که متغیر ما تغییر داده شود. اگر شما متغیر را در تابع خود تغییر نمیدهید، پس احتمالا نباید از پوینتر استفاده کنید.
2- عملکرد بهتر
-اگر رشتهای داشته باشید که شامل یک رمان کامل در حافظه باشد، کپی کردن این متغیر هر بار که به یک تابع جدید ارسال میشود، کاری بسیار گران است. ممکن است ارزشمند باشد که به جای این کار یک پوینتر را ارسال کنید، که باعث صرفهجویی در پردازنده و حافظه میشود. با این حال انجام این کار به قمیت خوانا بودن است، بنابراین فقط در صورت لزوم این بهینهسازی را انجام دهید.
3- به گزینه nil نیاز دارید
-گاهی اوقات یک تابع باید بداند که مقدار یک چیزی چیست، همچنین باید وجود یا عدم وجود آن را بداند. معمولا هنگام خواندن JSON از این استفاده میکنیم تا بدانیم فیلدی وجود دارد یا خیر.
🌱مزایای زبان گولنگ
- Compilation time is fast
- InBuilt concurrency support: light-weight processes (via goroutines), channels, select statement
- Conciseness, Simplicity, and Safety.
- Production of statically linked native binaries without external dependencies.
- Support for Interfaces and Type embdding.
Embedded
type PremiumDiscount struct{
Discount //Embedded
additional float32
}
by-value
type Parent struct{
value int64
}
func (i *Parent) Value() int64{
return i.value
}
type Child struct{
Parent
multiplier int64
}
func (i Child) Value() int64{
return i.value * i.multiplier
}
By-Pointer
type Bitmap struct{
data [4][4]bool
}
type Renderer struct{
*Bitmap //Embed by pointer
on uint8
off uint8
}
Embed an interface
type echoer struct{
io.Reader
}
Embedding an interface by pointer
type echoer struct{
*io.Reader
}
🌱زبان گولنگ از موارد زیر پشتیبانی نمی کند
- type inheritance
- operator overloading
- method overloading
- pointer arithmetic
- struct type in consts
🌱 فرق Atomic و mutex؟
به عبارتی وقتی شما از توابع اتومیک استفاده میکنید صرفا یک قسمتی از حافظه رو لاک میکنید. اون هم در یک بازی زمانی بسیار کوتاه. ولی زمانی که از موتکس استفاده میکنید، یک بلوک کد رو لاک میکنید
🌱 چه موقعی از channel و چه موقعی از mutex استفاده میشه برای گورتینگ ها؟(بحث ارتباط)؟
معمولاً در مواقعی که Goroutines نیاز به برقراری ارتباط با یکدیگر دارند از channels استفاده کنید و درصورتی که فقط یک Goroutine دارید و باید به بخش مهم کد دسترسی داشته باشد از Mutexes استفاده کنید.
🌱 چرا کپی کردن pointer کند تر از کپی کردن مقدار هست؟
- برای ارسال مقادیر کوچیکی که به مقدارشون فقط نیاز داریم از پوینتر استفاده نکنیم.
- توی متغیرهای کوچیک (کمتر از ۳۲کیلوبایت) کپی کردن یک پوینتر تقریبا به اندازه کپی کردن مقدار اون متغیر هزینه داره پس از این جهت سودی نمیبریم.
- کامپایلر چک هایی رو تولید میکنه که موقع رانتایم زمان dereferencing پوینتر اجرا میشن.
- پوینتر ها اکثرا توی Heap ذخیره میشن
- برای این کار از ابزار های Go استفاده میکنیم ( go build -gcflags="-m" main.go )
- اما اگر به صورت مقداری برگردونیم در stack ذخیره میشه.
- همونطوری که میدونیم ذخیره در stack بسیار بهینه تر هست.
- درواقع Garbage collector میاد heap رو چک میکنه و همونطوری که میدونیم هربار GC درحال بررسی هست به مدت چند میلیثانیه کل سرویس ما فریز میشه. و میتونه مشکل هایی مثل Memory Leak و .. بوجود بیاد
🌱 سوال؟
جواب