در این بخش ما یکسری سوالات مصاحبه به زبان فارسی ارائه دادیم که برای یافتن ضعفها کاربردی میباشد.
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
مقدار و وضعیت وجود داشتن را برمیگرداند.