در این بخش ما یکسری سوالات مصاحبه به زبان فارسی ارائه دادیم که برای یافتن ضعفها کاربردی میباشد.
1: چه تایپهایی مقدار zero آنها nil است؟
- interfaces
- slices
- channels
- maps
- pointers
- functions
2: تایپهای نوع Reference؟
- Pointers
- slices
- maps
- functions
- channels
3: تایپهای نوع Aggregate؟
- Array
- structs
4: چه وقت باید از پوینتر استفاده کنیم؟
1- تابعی که یکی از پارامترهای خود را تغییر میدهد -وقتی تابعی را فراخوانی میکنیم که یک پوینتر را به عنوان پارامتر میگیرد، انتظار داریم که متغیر ما تغییر داده شود. اگر شما متغیر را در تابع خود تغییر نمیدهید، پس احتمالا نباید از پوینتر استفاده کنید.
2- عملکرد بهتر -اگر رشتهای داشته باشید که شامل یک رمان کامل در حافظه باشد، کپی کردن این متغیر هر بار که به یک تابع جدید ارسال میشود، کاری بسیار گران است. ممکن است ارزشمند باشد که به جای این کار یک پوینتر را ارسال کنید، که باعث صرفهجویی در پردازنده و حافظه میشود. با این حال انجام این کار به قیمت خوانا بودن است، بنابراین فقط در صورت لزوم این بهینهسازی را انجام دهید.
3- به گزینه nil نیاز دارید -گاهی اوقات یک تابع باید بداند که مقدار یک چیزی چیست، همچنین باید وجود یا عدم وجود آن را بداند. معمولا هنگام خواندن JSON از این استفاده میکنیم تا بدانیم فیلدی وجود دارد یا خیر.
5: زبان گولنگ از چه قابلیت های معروف در زبان های دیگر پشتیبانی نمیکند؟
- type inheritance
- operator overloading
- method overloading
- pointer arithmetic
- struct type in consts
6: برای گوروتین ها چه مواقعی از channel و چه مواقعی از mutex استفاده می شود؟
7: تفاوت بین goroutine و thread را توضیح دهید.
8: توضیح دهید که interface در Golang چیست و چگونه میتواند مورد استفاده قرار گیرد.
9: چطور میتوانید memory leak در برنامههای نوشته شده به وسیله Golang را شناسایی و مدیریت کنید؟
10: در Golang چگونه میتوانیم dependency management را انجام دهیم؟
go mod init, go mod tidy , go mod vendor میتوان وابستگیهای لازم برای پروژه را مدیریت کرد.11: چه زمانی یک channel در Golang باید با buffer مورد استفاده قرار گیرد؟
12: توضیح دهید که defer statement چیست و چرا ممکن است از آن استفاده کنیم.
13: در Golang چگونه میتوانید اطمینان حاصل کنید که یک goroutine نتیجهای تولید میکند قبل از اینکه برنامه کار خود را به طور کامل متوقف کند؟
14: توضیح دهید که واحد ایزوله برای کد نویسی در Golang چیست (table-driven tests) و چرا مفید است.
15: چرا Go از ارث بری (inheritance) پشتیبانی نمیکند و از composition به عنوان جایگزین استفاده میکند؟
16: آیا در Golang میتوان از polymorphism استفاده کرد؟ اگر بله، چگونه؟
17: چه تفاوتی میان make و new در Golang وجود دارد؟
make در Go برای ایجاد sliceها، maps و channels استفاده میشود و یک ابجکت از نوع مورد نظر را با مقدار اولیه مشخصی برمیگرداند. از طرفی new یک pointer به یک ابجکت از یک نوع دادهای تعریف شده توسط کاربر را برمیگرداند که صفر اولیه شده است.18: متود (method) receivers در Golang چگونه کار میکند و تفاوت بین استفاده از pointer receiver و value receiver چیست؟
19: چگونه میتوان در Golang یک پکیج اختصاصی ایجاد کرد و چگونه میتوان آن را در دیگر فایلهای Go مورد استفاده قرار داد؟
package mypackage تعریف شود. برای استفاده از پکیج، import "path/to/mypackage" باید در دیگر فایلها قرار داده شود.20: در Golang، چگونه میتوانید error handling را اجرا کنید و چه روشهایی برای پیادهسازی custom error types وجود دارد؟
errors.New() برای ایجاد یک ارور ساده استفاده کنید یا یک تایپ که ارور را پیادهسازی میکند با متدهای اضافی برای دادههای اضافی مرتبط با ارور ایجاد کرد.21: کامپایلر گولنگ از نوع AOT است یا JIT؟ تفاوت بین AOT و JIT را بگو.
22: تفاوت بین nil و مقدار صفر در انواع داده چیست؟
23: تفاوت بین close(channel) و خواندن از یک کانال بسته چیست؟
close(channel)تنها برای ارسالکننده استفاده میشود تا به دریافتکنندهها اطلاع دهد دادهای دیگر ارسال نخواهد شد.- خواندن از یک کانال بسته مقدار صفر نوع داده را برمیگرداند بدون این که بلاک شود.
- ارسال روی کانال بسته panic ایجاد میکند.
24: چه زمانی باید از context استفاده کنیم؟
context.Context استفاده میکنیم. این ابزار برای همگامسازی لغو عملیات بین goroutineها و جلوگیری از resource leak بسیار مهم است.25: تفاوت sync.Mutex و sync.RWMutex چیست؟
sync.Mutexقفل سادهای است که در یک زمان فقط اجازه دسترسی به یک goroutine را میدهد.sync.RWMutexدو حالت دارد: قفل خواندن (میتواند همزمان توسط چند goroutine گرفته شود) و قفل نوشتن (انحصاری). این باعث بهبود عملکرد در سناریوهایی با خواندن زیاد و نوشتن کم میشود.
26: data race چیست و چگونه میتوان از آن جلوگیری کرد؟
sync.Mutex، sync.RWMutex، channelها یا اجتناب از اشتراک دادهها. ابزار go run -race میتواند این مشکلات را پیدا کند.27: در چه شرایطی slice باعث memory leak میشود؟
copy یا ساختن slice از ابتدا.28: تفاوت len و cap در slice چیست؟
lenتعداد عناصر موجود در slice را برمیگرداند.capظرفیت slice را برمیگرداند، یعنی تعداد عناصر از اندیس صفر تا انتهای آرایه زیرین که میتوان بدون تخصیص حافظه جدید استفاده کرد.
29: آیا map در Go thread-safe است؟
sync.Mutex، sync.RWMutex یا sync.Map استفاده کرد.30: چگونه میتوان یک panic را مدیریت کرد بدون اینکه برنامه متوقف شود؟
با استفاده از recover در داخل یک defer میتوان panic را گرفتن و از توقف کامل برنامه جلوگیری کرد:
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()
31: تفاوت بین unbuffered و buffered channel چیست؟
- Unbuffered channel: ارسالکننده تا زمانی که دریافتکننده آماده نباشد بلاک میشود.
- Buffered channel: ارسالکننده میتواند تا ظرفیت کانال داده بفرستد بدون بلاک شدن. دریافتکننده فقط زمانی بلاک میشود که کانال خالی باشد.
32: چرا نباید از pointer به متغیر loop variable در goroutine استفاده کرد؟
33: تفاوت := و var در تعریف متغیر چیست؟
:=فقط در داخل توابع و برای تعریف و مقداردهی اولیه استفاده میشود.varدر هر جایی (داخل یا بیرون تابع) میتواند استفاده شود و امکان تعریف بدون مقدار اولیه (با مقدار صفر) را میدهد.
34: چه زمانی باید از sync.Once استفاده کنیم؟
35: تفاوت nil interface و interface حاوی nil چیست؟
- nil interface: مقدار و نوع هر دو nil هستند.
- interface حاوی nil: نوع مشخص شده است ولی مقدار nil است. این تفاوت باعث میشود مقایسه مستقیم با nil نتیجه متفاوتی بدهد.
36: آیا گوروتینها به صورت موازی اجرا میشوند یا همزمانی (Concurrency) دارند؟
GOMAXPROCS متناسب تنظیم شده باشد، گوروتینها میتوانند موازی اجرا شوند.37: تفاوت rune و byte چیست؟
byteمعادلuint8است و برای نمایش دادههای خام یا کاراکترهای ASCII استفاده میشود.runeمعادلint32است و برای نمایش یک کاراکتر یونیکد استفاده میشود.
38: چرا استفاده بیش از حد از defer میتواند بر عملکرد تأثیر بگذارد؟
defer یک فراخوانی اضافه ایجاد میکند که در خروج از تابع اجرا میشود. در مسیرهای پر فراخوانی (hot path)، این میتواند باعث افت کارایی شود. در این موارد بهتر است منابع را به صورت دستی آزاد کرد.39: garbage collector در Go چه زمانی اجرا میشود؟
40: آیا slice به صورت مقادیر (value) پاس داده میشود یا ارجاع (reference)؟
41: چه زمانی استفاده از map به جای slice بهینهتر است؟
42: چگونه میتوان ظرفیت اولیه یک map را تعیین کرد و چرا این کار مهم است؟
make(map[KeyType]ValueType, initialCapacity) میتوان ظرفیت اولیه تعیین کرد. این باعث کاهش عملیات rehash و بهبود عملکرد میشود.43: تفاوت select بدون case و select با default چیست؟
select {}بدون case باعث بلاک شدن دائمی گوروتین میشود.select { default: ... }بلافاصله default را اجرا میکند اگر هیچ کانالی آماده نباشد.
44: چرا باید منابع مانند فایل یا connection را در defer بلافاصله بعد از ایجاد آن ببندیم؟
45: تفاوت channel جهتدار (send-only/receive-only) با channel دوطرفه چیست؟
- Send-only:
chan<- Tفقط اجازه ارسال دارد. - Receive-only:
<-chan Tفقط اجازه دریافت دارد. - دوطرفه:
chan Tمیتواند هم ارسال و هم دریافت انجام دهد.
46: چگونه میتوان benchmark در Go نوشت و اجرا کرد؟
func BenchmarkXxx(b *testing.B) و اجرای go test -bench=. میتوان benchmark گرفت. مقدار b.N مشخص میکند چند بار تست اجرا میشود.47: sync.Pool چیست و چه کاربردی دارد؟
sync.Pool یک ساختار برای ذخیره و بازیابی موقت اشیاء قابل استفاده مجدد است که فشار روی GC را کاهش میدهد. برای دادههای موقتی که ایجادشان هزینهبر است استفاده میشود.48: تفاوت testing.T و testing.B در پکیج testing چیست؟
testing.Tبرای تستهای معمولی و مدیریت خطاها استفاده میشود.testing.Bبرای benchmark استفاده میشود و شامل حلقه اجرای تکرارها (b.N) است.
49: آیا Go از tail call optimization پشتیبانی میکند؟
50: چه تفاوتی بین make و append برای ایجاد slice وجود دارد؟
makeیک slice با طول و ظرفیت مشخص ایجاد میکند.appendبرای افزودن عناصر به slice موجود استفاده میشود و در صورت پر بودن ظرفیت، یک آرایه جدید ایجاد میکند.
51: تفاوت بین زمانبندی گوروتینها در Go و threadها در سیستمعامل چیست؟
52: آیا استفاده از global variable در Go توصیه میشود؟ چرا؟
53: چرا تغییر دادن slice در یک goroutine میتواند روی goroutineهای دیگر تأثیر بگذارد؟
54: تفاوت string و []byte در Go چیست؟
string غیرقابل تغییر (immutable) است و تغییر مستقیم آن ممکن نیست. []byte قابل تغییر است و برای عملیات پردازشی روی دادهها بهینهتر است.55: چرا map در Go iteration order ثابت ندارد؟
56: چه زمانی باید از atomic operations استفاده کرد؟
sync/atomic برای این منظور استفاده میشود.57: تفاوت nil slice با empty slice چیست؟
- Nil slice:
nilاست، طول و ظرفیت صفر دارد. - Empty slice: مقدار غیر nil با طول صفر است، ولی به یک آرایه صفرظرفیت اشاره میکند.
58: چرا استفاده از pointer receiver برای struct بزرگ بهینهتر است؟
59: تفاوت fallthrough در switch چیست؟
fallthrough باعث میشود اجرای case بعدی بدون بررسی شرط ادامه یابد.60: چرا باید بعد از استفاده از ticker آن را متوقف کنیم؟
ticker.Stop()) باعث نشت منابع و ادامه کار goroutine داخلی آن میشود.61: تفاوت new و literal برای struct چیست؟
new(T)یک pointer به مقدار صفر نوع T برمیگرداند.&T{}نیز یک pointer میسازد ولی میتوان فیلدها را مقداردهی کرد.
62: چرا حلقه for range روی map ممکن است نتیجه متفاوتی در هر اجرا بدهد؟
63: تفاوت deep copy و shallow copy در Go چیست؟
- Shallow copy فقط مقادیر سطح اول را کپی میکند و referenceها همچنان مشترک میمانند.
- Deep copy تمام دادهها را بازگشتی کپی میکند تا هیچ اشتراک حافظه وجود نداشته باشد.
64: چه زمانی باید از select با context.Done استفاده کنیم؟
65: تفاوت بین runtime.GOMAXPROCS و تعداد گوروتینها چیست؟
GOMAXPROCS حداکثر تعداد threadهای همزمانی که میتوانند کد Go اجرا کنند را مشخص میکند، ولی تعداد گوروتینها میتواند بسیار بیشتر باشد و توسط scheduler مدیریت میشود.66: چرا string در Go غیرقابل تغییر است؟
67: تفاوت بین time.Sleep و استفاده از time.After چیست؟
time.Sleepاجرای گوروتین را برای مدت مشخص متوقف میکند.time.Afterیک channel برمیگرداند که بعد از گذشت مدت زمان مشخص سیگنال ارسال میکند و میتواند درselectاستفاده شود.
68: چرا نباید از panic برای کنترل جریان عادی برنامه استفاده کرد؟
69: sync.Cond چیست و چه زمانی استفاده میشود؟
sync.Cond ابزاری برای هماهنگسازی پیشرفته است که به goroutineها اجازه میدهد تا تا زمان برآورده شدن یک شرط منتظر بمانند و توسط دیگر goroutineها بیدار شوند.70: تفاوت بین context.Background و context.TODO چیست؟
context.Backgroundبرای شروع زنجیره context در برنامههای سطح بالا استفاده میشود.context.TODOزمانی استفاده میشود که هنوز مشخص نیست چه contextی باید استفاده شود یا در حال توسعه هستیم.
71: چرا mapهای بزرگ میتوانند باعث فشار روی GC شوند؟
72: تفاوت بین کانال بسته و nil channel چیست؟
- کانال بسته: خواندن از آن مقدار صفر و وضعیت بسته بودن را برمیگرداند. ارسال روی آن panic ایجاد میکند.
- nil channel: هر عملیات ارسال یا دریافت روی آن برای همیشه بلاک میشود.
73: چرا استفاده از range روی string با کاراکترهای یونیکد خاص میتواند کند باشد؟
74: چه زمانی باید از copy برای slice استفاده کنیم؟
75: تفاوت بین defer با تابع معمولی در مدیریت منابع چیست؟
defer تضمین میکند که تابع در پایان محدوده اجرا شود، حتی در صورت panic یا بازگشت زودهنگام، ولی تابع معمولی بلافاصله اجرا میشود.76: چرا نباید روی کانال nil عملیات انجام داد؟
77: تفاوت بین append به slice و append به nil slice چیست؟
78: چرا حلقههای for بدون شرط در Go میتوانند مشکلساز شوند؟
for {} بدون شرط توقف میتواند CPU را ۱۰۰٪ مشغول کند مگر اینکه شامل عملیات بلاککننده یا sleep باشد.79: sync.Map چه مزیتی نسبت به map با Mutex دارد؟
sync.Map برای سناریوهایی با خواندن زیاد و نوشتن کم بهینهسازی شده و نیازی به قفل دستی ندارد، ولی در همه موارد سریعتر از map+Mutex نیست.80: چرا تبدیل بین []byte و string در Go معمولاً باعث کپی میشود؟
81: چرا استفاده از time.Tick بدون توقف میتواند memory leak ایجاد کند؟
time.Tick یک channel بازگشتی ایجاد میکند که هرگز متوقف نمیشود. برای جلوگیری از نشت منابع، بهتر است از time.NewTicker استفاده کرده و در زمان مناسب Stop() را فراخوانی کنید.82: تفاوت بین interface خالی و interface با متد چیست؟
- Interface خالی (
interface{}) میتواند هر نوعی را نگه دارد. - Interface با متدها فقط میتواند نوعهایی را نگه دارد که تمام متدهای تعریفشده را پیادهسازی کرده باشند.
83: چرا استفاده از goroutine در حلقه for بدون همگامسازی میتواند مشکلساز باشد؟
84: تفاوت بین make برای map و literal map چیست؟
make(map[Key]Value, cap)ظرفیت اولیه را مشخص میکند.- Literal map (
map[Key]Value{...}) بلافاصله دادهها را مقداردهی میکند.
85: چرا نباید روی کانالی که چند تولیدکننده دارد بدون هماهنگی close انجام داد؟
86: تفاوت بین string literal با backtick و با quote چیست؟
- با quote (
"..."): رشته escape میشود و میتوان از\nو غیره استفاده کرد. - با backtick (
`...`): رشته raw است و escape interpretation انجام نمیشود.
87: چرا garbage collector نمیتواند فایلهای باز را ببندد؟
Close() آزاد کرد.88: تفاوت بین untyped constant و typed constant چیست؟
- Untyped constant میتواند با هر نوع سازگار استفاده شود تا زمانی که مقدارش در محدوده باشد.
- Typed constant نوع مشخص دارد و فقط با همان نوع یا نوعهای سازگار استفاده میشود.
89: چرا استفاده از recover خارج از defer بیاثر است؟
recover فقط زمانی panic را میگیرد که درون یک defer اجرا شود که در همان گوروتین panic اتفاق افتاده باشد.90: تفاوت بین range روی slice و روی array چیست؟
- روی slice: مقدار و اندیس عناصر slice را برمیگرداند.
- روی array: مشابه slice، ولی آرایه به صورت کامل پاس داده میشود که میتواند هزینهبر باشد مگر اینکه با reference پاس شود.
91: چرا capacity slice بعد از append ممکن است چند برابر شود؟
92: تفاوت بین runtime.Gosched و time.Sleep چیست؟
runtime.Goschedبه scheduler اجازه میدهد گوروتینهای دیگر را اجرا کند بدون توقف زمان مشخص.time.Sleepگوروتین را برای مدت مشخص متوقف میکند.
93: چرا nil pointer در method receiver ممکن است باعث panic نشود؟
94: تفاوت بین map[string]struct{} و map[string]bool چیست؟
map[string]struct{}حافظه کمتری مصرف میکند چون struct خالی صفر بایت است.map[string]boolنیاز به یک بایت برای مقدار دارد.
95: چرا استفاده از for-select بدون default میتواند کارایی را کاهش دهد؟
96: تفاوت بین var x = y و x := y چیست؟
var x = yمیتواند در سطح package یا تابع استفاده شود.x := yفقط در داخل توابع مجاز است و همیشه تعریف جدید انجام میدهد.
97: چرا استفاده از init function باید محدود باشد؟
98: تفاوت بین context.WithCancel و context.WithTimeout چیست؟
WithCancelفقط با فراخوانی تابع cancel لغو میشود.WithTimeoutبه صورت خودکار بعد از زمان مشخص لغو میشود.
99: چرا حلقههای بازگشتی بدون شرط توقف میتوانند باعث stack overflow شوند؟
100: تفاوت بین log.Fatal و panic چیست؟
log.Fatalپیام را چاپ کرده و برنامه را بلافاصله باos.Exitمتوقف میکند.panicاجرای عادی را متوقف کرده و chain فراخوانی deferها را اجرا میکند قبل از توقف.
101: تفاوت بین unsafe.Pointer و uintptr چیست؟
unsafe.Pointerبرای تبدیل بین انواع اشارهگر استفاده میشود.uintptrیک نوع عددی است که آدرس را به عنوان یک عدد ذخیره میکند. تبدیل بین آنها باید با احتیاط انجام شود چون ممکن است GC آدرس را جابجا کند.
102: چرا استفاده از reflect میتواند کارایی را کاهش دهد؟
reflect باعث عملیاتهای زمان اجرا و type checking پویا میشود که نسبت به کد معمولی کندتر است.103: تفاوت بین constant expression و runtime value چیست؟
104: چرا nil channel برای همگامسازی گاهی مفید است؟
select حذف کنیم و رفتار برنامه را به صورت پویا کنترل کنیم.105: تفاوت بین stack و heap allocation در Go چیست؟
106: چرا slicing از یک array بزرگ میتواند باعث نگهداشتن حافظه اضافی شود؟
107: تفاوت بین break و continue در حلقه چیست؟
breakحلقه را کامل متوقف میکند.continueفقط iteration جاری را رد کرده و iteration بعدی را شروع میکند.
108: چرا append ممکن است باعث تغییر آدرس حافظه slice شود؟
109: تفاوت بین go vet و go fmt چیست؟
go fmtکد را قالببندی میکند.go vetمشکلات احتمالی کد را شناسایی میکند ولی تغییرات ظاهری ایجاد نمیکند.
110: چرا باید از io.Reader و io.Writer در طراحی API استفاده کنیم؟
111: تفاوت بین os.Exit و return در main چیست؟
os.Exit فوراً برنامه را متوقف میکند و deferها اجرا نمیشوند، ولی return اجازه اجرای deferها را میدهد.112: چرا map نمیتواند به عنوان کلید slice داشته باشد؟
113: تفاوت بین io.Pipe و channel چیست؟
io.Pipe برای اتصال مستقیم بین io.Reader و io.Writer استفاده میشود، ولی channel برای ارسال هر نوع داده بین goroutineها استفاده میشود.114: چرا نباید از pointer به local variable بعد از پایان تابع استفاده کنیم؟
115: تفاوت بین testing.Short و تستهای عادی چیست؟
testing.Short() میتواند در تستها استفاده شود تا تستهای طولانی در حالت کوتاه اجرا نشوند.116: چرا باید برای عملیاتهای سنگین I/O از buffered channel استفاده کرد؟
117: تفاوت بین go build و go install چیست؟
go buildفایل اجرایی را در دایرکتوری جاری میسازد.go installآن را در مسیر bin در$GOPATHیا$GOBINنصب میکند.
118: چرا استفاده از strings.Builder به جای + برای رشتهها بهتر است؟
119: تفاوت بین cap و len در array چیست؟
120: چرا باید بعد از استفاده از bufio.Writer حتماً Flush کرد؟
121: تفاوت بین import _ و import alias چیست؟
import _فقط برای اجرای init پکیج است.- Import alias برای استفاده از نام متفاوت جهت ارجاع به پکیج.
122: چرا باید از context در عملیاتهای شبکه استفاده کنیم؟
123: تفاوت بین interface value و concrete value چیست؟
124: چرا استفاده از constant برای magic number بهتر است؟
125: تفاوت بین log.Println و fmt.Println چیست؟
log.Println علاوه بر چاپ پیام، timestamp هم اضافه میکند.126: چرا sync.WaitGroup باید با Add قبل از اجرای goroutine استفاده شود؟
127: تفاوت بین path و filepath در Go چیست؟
pathبرای مسیرهای URL و forward slash استفاده میشود.filepathبرای مسیرهای سیستم فایل وابسته به سیستمعامل استفاده میشود.
128: چرا استفاده از http.Client پیشفرض میتواند مشکلساز باشد؟
129: تفاوت بین sync.Mutex و sync.RWMutex در خواندن زیاد چیست؟
sync.RWMutex اجازه میدهد چندین خواننده همزمان کار کنند، ولی Mutex فقط یک قفل کلی میدهد.130: چرا panic در گوروتین جداگانه باید به صورت جداگانه recover شود؟
131: تفاوت بین os.Create و os.OpenFile چیست؟
os.Createفایل را با truncate ایجاد یا باز میکند.os.OpenFileکنترل کامل روی mode و flagها میدهد.
132: چرا context باید به صورت اولین آرگومان به توابع پاس داده شود؟
133: تفاوت بین errors.Is و errors.As چیست؟
errors.Isبرای بررسی تطابق با یک خطای خاص استفاده میشود.errors.Asبرای استخراج و استفاده از نوع خاص خطا.
134: چرا نباید از defer در حلقههای شدیداً پرتکرار استفاده کرد؟
135: تفاوت بین nil slice و empty slice در JSON چیست؟
null سریالایز میشود، ولی empty slice به [].136: چرا map در Go به صورت داخلی rehash انجام میدهد؟
137: تفاوت بین encoding/json و jsoniter چیست؟
jsoniter سریعتر و انعطافپذیرتر است ولی encoding/json رسمی و پایدار است.138: چرا باید کانال را فقط توسط ارسالکننده ببندیم؟
139: تفاوت بین context.WithValue و متغیر global چیست؟
140: چرا time.AfterFunc میتواند به جای time.Sleep مفید باشد؟
141: تفاوت بین select با یک case و استفاده مستقیم از channel چیست؟
select حتی با یک case هم امکان اضافه کردن default یا caseهای دیگر را در آینده میدهد و ساختار کد را منعطفتر میکند، ولی دریافت مستقیم سادهتر است.142: چرا استفاده از buffer بزرگتر در bufio.Reader میتواند کارایی را بهبود دهد؟
143: تفاوت بین defer با anonymous function و با نام تابع چیست؟
144: چرا از sync/atomic برای شمارندهها استفاده میشود؟
145: تفاوت بین byte buffer و byte slice چیست؟
146: چرا استفاده از fallthrough باید محدود باشد؟
147: تفاوت بین log.Fatal و os.Exit چیست؟
log.Fatal قبل از توقف پیام خطا را چاپ میکند، ولی os.Exit فقط برنامه را متوقف میکند.148: چرا map در Go بهصورت همزمان توسط چند goroutine قابل استفاده نیست؟
149: تفاوت بین os.Getenv و os.LookupEnv چیست؟
os.Getenvرشته را برمیگرداند و اگر وجود نداشته باشد مقدار خالی میدهد.os.LookupEnvمقدار و وضعیت وجود داشتن را برمیگرداند.