ar
Feedback
Gopher Academy

Gopher Academy

الذهاب إلى القناة على Telegram
3 832
المشتركون
+324 ساعات
+147 أيام
+1830 أيام
جذب المشتركين
أغسطس '26
أغسطس '26
+67
في 4 قنوات
يوليو '26
+58
في 0 قنوات
Get PRO
يونيو '26
+67
في 0 قنوات
Get PRO
مايو '26
+45
في 0 قنوات
Get PRO
أبريل '26
+24
في 5 قنوات
Get PRO
مارس '26
+10
في 0 قنوات
Get PRO
فبراير '26
+79
في 1 قنوات
Get PRO
يناير '26
+29
في 8 قنوات
Get PRO
ديسمبر '25
+103
في 7 قنوات
Get PRO
نوفمبر '25
+72
في 0 قنوات
Get PRO
أكتوبر '25
+598
في 1 قنوات
Get PRO
سبتمبر '25
+61
في 6 قنوات
Get PRO
أغسطس '25
+84
في 9 قنوات
Get PRO
يوليو '25
+99
في 10 قنوات
Get PRO
يونيو '25
+47
في 7 قنوات
Get PRO
مايو '25
+45
في 1 قنوات
Get PRO
أبريل '25
+63
في 8 قنوات
Get PRO
مارس '25
+90
في 8 قنوات
Get PRO
فبراير '25
+91
في 3 قنوات
Get PRO
يناير '25
+96
في 3 قنوات
Get PRO
ديسمبر '24
+113
في 7 قنوات
Get PRO
نوفمبر '24
+94
في 2 قنوات
Get PRO
أكتوبر '24
+116
في 4 قنوات
Get PRO
سبتمبر '24
+138
في 4 قنوات
Get PRO
أغسطس '24
+101
في 2 قنوات
Get PRO
يوليو '24
+187
في 5 قنوات
Get PRO
يونيو '24
+173
في 11 قنوات
Get PRO
مايو '24
+301
في 2 قنوات
Get PRO
أبريل '24
+185
في 3 قنوات
Get PRO
مارس '24
+172
في 3 قنوات
Get PRO
فبراير '24
+154
في 0 قنوات
Get PRO
يناير '24
+207
في 0 قنوات
Get PRO
ديسمبر '23
+215
في 4 قنوات
Get PRO
نوفمبر '23
+77
في 2 قنوات
Get PRO
أكتوبر '23
+79
في 0 قنوات
Get PRO
سبتمبر '23
+70
في 0 قنوات
Get PRO
أغسطس '23
+108
في 0 قنوات
Get PRO
يوليو '23
+68
في 0 قنوات
Get PRO
يونيو '23
+106
في 0 قنوات
Get PRO
مايو '23
+211
في 0 قنوات
Get PRO
أبريل '23
+142
في 0 قنوات
Get PRO
مارس '23
+56
في 0 قنوات
Get PRO
فبراير '23
+70
في 0 قنوات
Get PRO
يناير '23
+62
في 0 قنوات
Get PRO
ديسمبر '22
+14
في 0 قنوات
Get PRO
نوفمبر '22
+24
في 0 قنوات
Get PRO
أكتوبر '22
+15
في 0 قنوات
Get PRO
سبتمبر '22
+78
في 0 قنوات
Get PRO
أغسطس '22
+47
في 0 قنوات
Get PRO
يوليو '22
+36
في 0 قنوات
Get PRO
يونيو '22
+26
في 0 قنوات
Get PRO
مايو '22
+27
في 0 قنوات
Get PRO
أبريل '22
+14
في 0 قنوات
Get PRO
مارس '22
+21
في 0 قنوات
Get PRO
فبراير '22
+13
في 0 قنوات
Get PRO
يناير '22
+24
في 0 قنوات
Get PRO
ديسمبر '21
+51
في 0 قنوات
Get PRO
نوفمبر '21
+107
في 0 قنوات
Get PRO
أكتوبر '21
+13
في 0 قنوات
Get PRO
سبتمبر '21
+31
في 0 قنوات
Get PRO
أغسطس '21
+29
في 0 قنوات
Get PRO
يوليو '21
+41
في 0 قنوات
Get PRO
يونيو '21
+29
في 0 قنوات
Get PRO
مايو '21
+26
في 0 قنوات
Get PRO
أبريل '21
+49
في 0 قنوات
Get PRO
مارس '21
+376
في 0 قنوات
التاريخ
نمو المشتركين
الإشارات
القنوات
30 أغسطس+3
29 أغسطس+3
28 أغسطس+1
27 أغسطس+2
26 أغسطس+1
25 أغسطس+4
24 أغسطس+3
23 أغسطس+5
22 أغسطس+2
21 أغسطس+2
20 أغسطس+3
19 أغسطس+1
18 أغسطس0
17 أغسطس+1
16 أغسطس+1
15 أغسطس+3
14 أغسطس0
13 أغسطس+2
12 أغسطس+3
11 أغسطس+1
10 أغسطس0
09 أغسطس+1
08 أغسطس+4
07 أغسطس+3
06 أغسطس+5
05 أغسطس+6
04 أغسطس0
03 أغسطس+4
02 أغسطس+1
01 أغسطس+2
منشورات القناة
پروژه Rostam یک دیتابیس برداری متن‌باز و یک Key-Value Store با تأخیر بسیار پایین است که با زبان Go نوشته شده و می‌تواند هم به‌ صورت کتابخانه داخلی و هم به‌عنوان سرویس مستقل اجرا شود. https://docs.rostamlabs.com https://github.com/rostamlabs/rostam

2
درود و وقت بخیر دوستان. آیا کسی اینجا هست که در شرکت دیوار کار کنه؟ یک سوال داشتم. اگر کسی هست بهم پیام بده👇 @Mrbardia72
104
3
sticker.webp
179
4
☝️ ویژگی‌های Go 1.26 رو از اینجا دنبال کنید. این پست به‌مرور به‌روزرسانی می‌شه و بعد از اون می‌ریم سراغ ویژگی‌های Go 1.27.
171
5
🎖Process Handle بعد از اینکه یک process را در Go اجرا می‌کنید، می‌توانید شناسهٔ آن، یعنی PID، را در اختیار داشته باشید: attr := &os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}} proc, _ := os.StartProcess("/bin/echo", []string{"echo", "hello"}, attr) defer proc.Wait() fmt.Println("pid =", proc.Pid) اما در داخل runtime، نوع os.Process ــ در صورتی که سیستم‌عامل پشتیبانی کند ــ به‌جای PID که صرفاً یک عدد صحیح است، از یک process handle استفاده می‌کند. در لینوکس، این handle مشخصاً یک pidfd است؛ یعنی یک file descriptor که به یک process اشاره می‌کند. استفاده از handle به‌جای PID یک مزیت مهم دارد: متدهای Process تضمین می‌کنند که همیشه با همان process موردنظر کار می‌کنند، نه با process دیگری که صرفاً به‌صورت تصادفی همان ID را دریافت کرده باشد. این مسئله مهم است چون PIDها قابل reuse شدن هستند. دسترسی به handle پیش از Go 1.26 امکان دسترسی مستقیم به process handle وجود نداشت. اکنون متد جدید Process.WithHandle این امکان را فراهم می‌کند: func (p *Process) WithHandle(f func(handle uintptr)) error ا WithHandle یک function مشخص‌شده توسط شما را فراخوانی می‌کند و process handle را به‌عنوان آرگومان در اختیار آن قرار می‌دهد: attr := &os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}} proc, _ := os.StartProcess("/bin/echo", []string{"echo", "hello"}, attr) defer proc.Wait() fmt.Println("pid =", proc.Pid) proc.WithHandle(func(handle uintptr) { fmt.Println("handle =", handle) }) یک ویژگی مهم این است که handle تضمین می‌کند تا زمانی که callback برنگشته است، همچنان به همان process اشاره کند؛ حتی اگر process در این فاصله terminate شده باشد. به همین دلیل API به‌صورت callback طراحی شده است، نه مثلاً به شکل یک field یا method مانند: Process.Handle چنین طراحی‌ای امکان می‌دهد lifetime مربوط به handle به‌طور دقیق کنترل شود و handle پس از پایان callback معتبر تلقی نشود.
159
6
🎖Peek into a Buffer در Go 1.26، package bytes متد جدید Buffer.Peek را اضافه کرده است. این متد N بایت بعدی buffer را برمی‌گرداند، بدون اینکه موقعیت خواندن (read position) را جلو ببرد: buf := bytes.NewBufferString("I love bytes") sample, err := buf.Peek(1) fmt.Printf("peek=%s err=%v\n", sample, err) buf.Next(2) sample, err = buf.Peek(4) fmt.Printf("peek=%s err=%v\n", sample, err) بنابراین Peek برای زمانی مفید است که بخواهید قبل از مصرف داده، بخش بعدی آن را بررسی کنید. اگر Peek نتواند N بایت کامل را برگرداند، علاوه بر دادهٔ موجود، مقدار خطای io.EOF را نیز برمی‌گرداند: buf := bytes.NewBufferString("hello") sample, err := buf.Peek(10) fmt.Printf("peek=%s err=%v\n", sample, err) در این مثال فقط ۵ بایت در buffer وجود دارد، بنابراین Peek(10) همان ۵ بایت موجود را برمی‌گرداند و io.EOF را نیز گزارش می‌کند. نکتهٔ مهم دربارهٔ slice بازگردانده‌شده ا sliceای که Peek برمی‌گرداند، به محتوای خود buffer اشاره می‌کند و یک copy مستقل نیست. این slice تا زمانی معتبر است که buffer تغییر نکرده باشد. بنابراین اگر بلافاصله محتوای slice را تغییر دهید، در واقع buffer زیرین را تغییر داده‌اید و این تغییر در خواندن‌های بعدی دیده خواهد شد: buf := bytes.NewBufferString("car") sample, err := buf.Peek(3) fmt.Printf("peek=%s err=%v\n", sample, err) sample[2] = 't' // changes the underlying buffer data, err := buf.ReadBytes(0) fmt.Printf("data=%s err=%v\n", data, err) در اینجا مقدار sample[2] از 'r' به 't' تغییر می‌کند؛ اما چون sample مستقیماً به محتوای buffer اشاره دارد، خود buffer نیز تغییر می‌کند.
82
7
🎖Reflective Iterators در Go 1.26، package reflect متدهای جدیدی به نام‌های Type.Fields و Type.Methods اضافه کرده است که برای پیمایش fieldها و methodهای یک type، iterator برمی‌گردانند. برای مثال، می‌توان fieldهای یک struct را این‌گونه پیمایش کرد: // List the fields of a struct type. typ := reflect.TypeFor[http.Client]() for f := range typ.Fields() { fmt.Println(f.Name, f.Type) } و methodهای آن را نیز به همین شکل: // List the methods of a struct type. typ := reflect.TypeFor[*http.Client]() for m := range typ.Methods() { fmt.Println(m.Name, m.Type) } همچنین دو متد جدید Type.Ins و Type.Outs برای typeهای تابع وجود دارند که iterator مربوط به پارامترهای ورودی و خروجی تابع را برمی‌گردانند: typ := reflect.TypeFor[filepath.WalkFunc]() fmt.Println("Inputs:") for par := range typ.Ins() { fmt.Println("-", par.Name()) } fmt.Println("Outputs:") for par := range typ.Outs() { fmt.Println("-", par.Name()) } در سمت Value نیز متدهای جدید Value.Fields و Value.Methods اضافه شده‌اند که iterator مربوط به fieldها و methodهای یک value را برمی‌گردانند. نکتهٔ مهم این است که هر iteration هم‌زمان اطلاعات type (StructField یا Method) و خود value را در اختیار قرار می‌دهد: client := &http.Client{} val := reflect.ValueOf(client) fmt.Println("Fields:") for f, v := range val.Elem().Fields() { fmt.Printf("- name=%s kind=%s\n", f.Name, v.Kind()) } fmt.Println("Methods:") for m, v := range val.Methods() { fmt.Printf("- name=%s kind=%s\n", m.Name, v.Kind()) } روش قدیمی پیش از Go 1.26، برای به‌دست‌آوردن همین اطلاعات می‌توانستید از یک حلقهٔ for-range همراه با متدهای NumX استفاده کنید؛ در واقع iteratorهای جدید نیز در داخل خود همین الگو را پیاده‌سازی می‌کنند: // go 1.25 typ := reflect.TypeFor[http.Client]() for i := range typ.NumField() { field := typ.Field(i) fmt.Println(field.Name, field.Type) } در Go 1.26، استفاده از iterator کد را مختصرتر و خواناتر می‌کند و نیاز به مدیریت index و فراخوانی جداگانهٔ Field(i) یا APIهای مشابه را از بین می‌برد. البته در مقابل، API سطح reflect نیز بزرگ‌تر شده است؛ اما به نظر می‌رسد این افزایش در API surface با سادگی و خوانایی بیشتر کد قابل توجیه باشد.
63
8
🎖Goroutine Metrics متریک‌های جدید در package runtime/metrics دید بهتری نسبت به زمان‌بندی goroutineها (goroutine scheduling) ارائه می‌کنند: تعداد کل goroutineهایی که از زمان شروع برنامه ایجاد شده‌اند. تعداد goroutineها در هر وضعیت (state). تعداد threadهای فعال. فهرست کامل metricهای جدید: /sched/goroutines-created:goroutines Count of goroutines created since program start. /sched/goroutines/not-in-go:goroutines Approximate count of goroutines running or blocked in a system call or cgo call. /sched/goroutines/runnable:goroutines Approximate count of goroutines ready to execute, but not executing. /sched/goroutines/running:goroutines Approximate count of goroutines executing. Always less than or equal to /sched/gomaxprocs:threads. /sched/goroutines/waiting:goroutines Approximate count of goroutines waiting on a resource (I/O or sync primitives). /sched/threads/total:threads The current count of live threads that are owned by the Go runtime. معنای هر metric را می‌توان به این صورت خلاصه کرد: /sched/goroutines-created — تعداد goroutineهایی که از زمان شروع برنامه ایجاد شده‌اند. /sched/goroutines/not-in-go — تعداد تقریبی goroutineهایی که در حال اجرای system call یا cgo call هستند، یا در آن‌ها blocked شده‌اند. /sched/goroutines/runnable — تعداد تقریبی goroutineهایی که آمادهٔ اجرا هستند، اما در حال اجرا نیستند. /sched/goroutines/running — تعداد تقریبی goroutineهایی که در حال اجرا هستند. این مقدار همیشه کمتر از یا مساوی /sched/gomaxprocs:threads است. /sched/goroutines/waiting — تعداد تقریبی goroutineهایی که منتظر یک resource، مانند I/O یا sync primitiveها، هستند. /sched/threads/total — تعداد فعلی threadهای زنده‌ای که تحت مالکیت Go runtime هستند. متریک‌های مربوط به وضعیت goroutineها می‌توانند مستقیماً به برخی مشکلات رایج در production مرتبط شوند. برای مثال: افزایش مداوم تعداد waiting می‌تواند نشانهٔ مشکل lock contention باشد. مقدار بالای not-in-go نشان می‌دهد تعداد زیادی goroutine در system callها یا cgo گیر کرده‌اند. رشد backlog در runnable می‌تواند نشان‌دهندهٔ این باشد که CPUها نمی‌توانند حجم تقاضای اجرای کار را همگام با تولید آن پردازش کنند. مقادیر این metricهای جدید را می‌توان مانند سایر metricها با تابع معمول metrics.Read خواند: func main() { go work() // omitted for brevity time.Sleep(100 * time.Millisecond) printMetric("/sched/goroutines-created:goroutines", "Created") printMetric("/sched/goroutines:goroutines", "Live") printMetric("/sched/goroutines/not-in-go:goroutines", "Syscall/CGO") printMetric("/sched/goroutines/runnable:goroutines", "Runnable") printMetric("/sched/goroutines/running:goroutines", "Running") printMetric("/sched/goroutines/waiting:goroutines", "Waiting") printMetric("/sched/gomaxprocs:threads", "Max") printMetric("/sched/threads/total:threads", "Live") } func printMetric(name string, descr string) { sample := []metrics.Sample{{Name: name}} metrics.Read(sample) fmt.Printf(" %s: %v\n", descr, sample[0].Value.Uint64()) } یک نکتهٔ مهم برای تحلیل این metricها وجود دارد: مقادیر مربوط به وضعیت‌های مختلف goroutine، یعنی: not-in-go + runnable + running + waiting الزاماً برابر با تعداد goroutineهای زنده نیستند (/sched/goroutines:goroutines)؛ این metric از Go 1.16 در دسترس بوده است. همچنین تمام metricهای جدید از counterهای نوع uint64 استفاده می‌کنند.
76
9
🔵 عنوان مقاله Sloc, Cloc and Code (scc) 4.0: A Fast Accurate 'Code Counter' 🟢 خلاصه مقاله: نسخه ۴.۰ ابزار Sloc, Cloc و Code (scc) یک ابزار سریع و دقیق برای شمارش خطوط کد است که امکان برآورد میزان پیچیدگی کد را در بسیاری از زبان‌های برنامه‌نویسی فراهم می‌کند. این ابزار به توسعه‌دهندگان کمک می‌کند تا در کوتاه‌ترین زمان، تعداد خطوط کد پروژه‌های خود را محاسبه و تحلیل کنند، کار که قبلاً نیازمند صرف زمان و نیروی زیادی بود. با قدرت و سرعت بالای این نسخه، می‌توان به راحتی حجم کدهای بزرگ و چندزبانه را بررسی و مدیریت کرد، که برای تیم‌های توسعه بسیار ارزشمند است. این ابزار به طور خاص برای کسانی طراحی شده است که نیازمند سرعت و دقت در ارزیابی پروژه‌های نرم‌افزاری هستند. با استفاده از سطوح مختلف تحلیل، می‌توان میزان پیچیدگی را بر اساس تعداد خطوط، فایل‌ها یا زبان‌های متفاوت تخمین زد. همچنین، این نسخه جدید امکانات بیشتری برای جامع‌تر بودن گزارش‌ها و سازگاری با زبان‌های برنامه‌نویسی مختلف دارد، که آن را به ابزاری کامل و کاربردی تبدیل کرده است. در مجموع، نسخه ۴.۰ ابزار scc برای برنامه‌نویسان، مدیران پروژه و همه افرادی که در حوزه توسعه نرم‌افزار فعالیت می‌کنند، ابزاری ضروری است که نه تنها فرآیند شمارش و تحلیل کد را تسهیل می‌کند، بلکه باعث افزایش بهره‌وری و تصمیم‌گیری بهتر در روند توسعه می‌شود. با این ابزار، مدیریت کدهای پروژه‌های بزرگ به شکل موثرتری امکان‌پذیر خواهد بود، و میزان تحلیل و ارزیابی پروژه‌ها بهبود می‌یابد. #کد #برنامه‌نویسی #تحلیل_کد #ابزارهای_توسعه 🟣لینک مقاله: https://github.com/boyter/scc ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
121
10
🔵 عنوان مقاله Go 1.27 interactive tour 🟢 خلاصه مقاله: در حال حاضر، نسخه ۱.۲۷ زبان برنامه‌نویسی گو، یک تور تعاملی را ارائه می‌دهد که به صورت جامع و کامل، جزئیات فنی و به‌روزرسانی‌های عملی آن را پوشش می‌دهد. این تور، فرصتی عالی برای توسعه‌دهندگان است تا با ویژگی‌های جدید و بهبودهای قابل توجه در این نسخه آشنا شوند و نحوه بهره‌برداری بهتر از قابلیت‌های آن را بیاموزند. با استفاده از این راهنمای تعاملی، کاربران می‌توانند به صورت گام به گام، مهارت‌های خود را در استفاده از این نسخه ارتقاء دهند و کاربردهای عملی آن را بهتر درک کنند، که نهایتاً به افزایش بهره‌وری و کارایی در پروژه‌هایشان کمک خواهد کرد. نسخه ۱.۲۷ گو به عنوان یکی از به‌روزرسانی‌های مهم، تغییرات قابل توجهی در زمینه‌هایی مانند بهینه‌سازی عملکرد، امنیت و امکانات توسعه‌دهندگان داشته است. این تور تعاملی، فضا را برای یادگیری عملی فراهم می‌آورد و اطمینان می‌دهد که کاربران تمامی جنبه‌های جدید را به خوبی بفهمند و بتوانند آن‌ها را به صورت مؤثر در پروژه‌های خود پیاده‌سازی کنند. به این ترتیب، این راهنمای تعاملی فرصت مناسبی است تا هم مبتدیان و هم توسعه‌دهندگانی که قصد ارتقاء مهارت‌های خود را دارند، به سرعت و به راحتی با تغییرات نسخه جدید آشنا شوند و به روز باشند. در کل، این تور تعاملی، یک ابزار ارزشمند است که ضمن ارائه اطلاعات کامل و به‌روزرسانی‌های جامع، نقش مهمی در تسهیل فرآیند یادگیری و بهبود کارایی توسعه‌دهندگان دارد. با بهره‌گیری از این راهنمای عملی، کاربران می‌توانند پایه‌های دانش خود را قوی‌تر کنند و از فناوری‌های جدید به بهترین شکل بهره‌مند شوند، و در نهایت، پروژه‌های موفق‌تری را رقم بزنند. #برنامه‌نویسی #گو #به‌روزرسانی #توسعه‌دهندگان 🟣لینک مقاله: https://victoriametrics.com/blog/go-1-27/ ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
147
11
🔵 عنوان مقاله deep dive into the select statement 🟢 خلاصه مقاله: در این مقاله، به بررسی دقیق و جامع مفهوم دستور SELECT در زبان برنامه‌نویسی Golang می‌پردازیم. این دستور یکی از رکن‌های اصلی در کار با پایگاه‌های داده است و شناخت کامل آن برای توسعه‌دهندگان ضروری است. در ابتدا، توضیح می‌دهیم که چگونه SELECT به ما امکان می‌دهد داده‌های مورد نیاز خود را از دیتابیس‌ها استخراج کنیم و نقش آن در برنامه‌های کاربردی چیست. سپس، به جزئیات مربوط به نحوه نوشتن و استفاده صحیح از این دستور، از جمله فیلتر کردن، مرتب‌سازی و محدود کردن نتایج، می‌پردازیم. مقاله با تمرکز بر نکات کلیدی و ترفندهای عملی، راهنمای جامعی برای توسعه‌دهندگان فراهم می‌آورد تا بتوانند به بهترین شکل از این ابزار قدرتمند بهره‌مند شوند. در نهایت، با تمرکز بر مثال‌های عملی و نکات کاربردی، کاربران می‌آموزند چگونه دستورات SELECT را در پروژه‌های خود به کار ببرند و مشکلات رایج هنگام استفاده از آن را حل کنند. این مطالعه، یک مرجع ارزشمند برای همه‌ی برنامه‌نویسان Golang است که می‌خواهند مهارت‌های خود در کار با پایگاه داده‌ها را ارتقا دهند و به عنوان توسعه‌دهنده‌ای ماهر در این حوزه شناخته شوند. #گولنگ #پایگاه‌داده #برنامه‌نویسی #توسعه 🟣لینک مقاله: https://www.youtube.com/watch?v=fH5hoZJL_tQ&list=PLGZGLmEvGK8I&index=19 ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
158
12
🔵 عنوان مقاله shortuuid 5.0: Generate Concise, Unambiguous URL-Safe UUIDs 🟢 خلاصه مقاله: نسخه ۵.۰ از کوت‌ یودی‌یوآی (shortuuid) اکنون امکانات جدیدی را برای تولید شناسه‌های کوتاه، واضح و قابل‌اعتماد ارائه می‌دهد که در URL ها به راحتی قابل استفاده هستند. این ابزار قدرتمند است که به توسعه‌دهندگان کمک می‌کند شناسه‌هایی منحصر به فرد، کوتاه و در عین حال آسان برای خواندن و استفاده در سیستم‌های مختلف ایجاد کنند. در نتیجه، کاربرها و تیم‌های فنی می‌توانند به راحتی به این شناسه‌ها تکیه کنند بدون اینکه نگرانی از بابت ناسازگاری یا طولانی بودن آن‌ها داشته باشند. در زمان‌هایی که نیاز است شناسه‌های کوتاه و معنی‌دار برای آی‌دی‌گذاری، لینک‌ها یا هر نوع ارجاع دیگری در برنامه‌های وب یا اپلیکیشن‌های موبایل استفاده شود، نسخه جدید آن با افزودن ویژگی‌های پیشرفته، روند تولید این نوع آیدی‌ها را بسیار ساده‌تر کرده است. با این قابلیت‌ها، این ابزار به صورت مؤثری پروژه‌ها را از پیچیدگی‌ها و خطاهای رایج در سیستم‌های معمول خلاص می‌کند، و تضمین می‌کند که شناسه‌های تولید شده هم طول مناسبی دارند و هم در برابر خطای انسانی مقاوم هستند. در نهایت، نسخه جدید این ابزار بر اهمیت تولید شناسه‌هایی که هم کوتاه، هم قابل فهم و هم غیرقابل‌اشکارسازی باشند، تأکید می‌کند. این ویژگی‌ها مخصوصاً در حوزه‌هایی که امنیت و سادگی در استفاده اهمیت دارد، بسیار کاربردی است و نشان می‌دهد که توسعه‌دهندگان می‌توانند با اطمینان بیشتری از این ابزار بهره‌مند شوند. #شناسه_کوتاه #امنیت_در_وب #لیکنک_ساز #توسعه‌دهندگان 🟣لینک مقاله: https://github.com/lithammer/shortuuid ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
154
13
🔵 عنوان مقاله building tools to refactor Go 🟢 خلاصه مقاله: در حال حاضر، توسعه ابزارهای قدرتمند برای بازطراحی و بهبود کد زبان برنامه‌نویسی Go علاوه بر افزایش کارایی، روند توسعه برنامه‌های پایدار و قابل‌نگهداری را تسهیل می‌کند. یکی از مباحث مهم در این حوزه، تمرکز بر روی ساختارهای کنترلی مانند دستور `select` است که به برنامه‌نویسان اجازه می‌دهد به صورت هم‌زمان و مؤثر چندین کانال را نظارت و مدیریت کنند. این ابزارها و مفاهیم عمیق، به توسعه‌دهندگان کمک می‌کنند تا در برنامه‌های خود، پیچیدگی‌های موازی‌سازی را به بهترین شکل کنترل کرده و کارایی سیستم‌های چندریسه‌ای را ارتقا دهند. در این زمینه، تحلیل دقیق و جامع در مورد نحوه عملکرد و کاربردهای دستور `select` در برنامه‌نویسی Go، اهمیت ویژه‌ای دارد. این بررسی، روش‌های مختلف بهره‌برداری موثر از `select` را شرح می‌دهد و نکات کلیدی در بهینه‌سازی و عیب‌یابی برنامه‌های موازی را نشان می‌دهد. بنابراین، آشنایی عمیق با این ساختار، ابزار مهمی است که به برنامه‌نویسان کمک می‌کند تا کدهای سریع‌تر، مقاوم‌تر و مقیاس‌پذیرتری بنویسند و توسعه پروژه‌های بزرگ را ساده‌تر نمایند. در مجموع، توسعه ابزارهای جدید و درک بهتر مفاهیم پایه، مسیر را برای ساختن برنامه‌هایی مطمئن‌تر، قابل‌انعطاف‌تر و کارآمدتر در زبان Go هموار می‌کند. شناخت دقیق و مهارت در استفاده از دستور `select`، جزء کلیدی برای هر برنامه‌نویس است که قصد دارد در عرصه توسعه نرم‌افزارهای مدرن عملکرد برتری داشته باشد. #برنامه‌نویسی #زبان_گو #ابزارهای_کد #ساختارهای_هم‌زمان 🟣لینک مقاله: https://www.youtube.com/watch?v=RK7oQie4d9k&list=PLGZGLmEvGK8I&index=16 ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
174
14
بریم قدم به قدم داخل این پیامی panic بشکافیمش، چون واقعاً یکی از فنی‌ترین بخش‌های خروجی panic هست و به سطح سیستم‌عامل مرتبط می‌شه، نه فقط به خود Go. [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x47f1a3] تک‌تک بخش‌ها signal SIGSEGV این SIGSEGV مخفف Segmentation Violation Signal‌ه، یکی از سیگنال‌های استاندارد یونیکس/لینوکس (شماره‌ش معمولاً ۱۱ هست). این سیگنال وقتی فرستاده می‌شه که یک پروسه بخواد به حافظه‌ای دسترسی پیدا کنه که: بهش اختصاص داده نشده (unmapped memory) یا مجوز دسترسی بهش رو نداره (مثلاً بخواد روی یک صفحه‌ی read-only بنویسه) segmentation violation این فقط توضیح متنیِ خود SIGSEGV‌ه؛ چیز اضافه‌ای نیست، صرفاً ترجمه‌ی خوانای نام سیگنال. code=0x1 این مقدار si_code سیستم‌عامله که دلیل دقیق‌تر وقوع SIGSEGV رو مشخص می‌کنه. توی لینوکس دو مقدار رایج داره: 0x1 SEGV_MAPERR آدرس اصلاً به هیچ حافظه‌ای map نشده (map نبودن آدرس) 0x2 SEGV_ACCERR آدرس map شده، ولی دسترسی مجاز نیست (مثلاً نوشتن روی حافظه‌ی read-only) توی مثال ما code=0x1 یعنی داشتیم به آدرسی دسترسی پیدا می‌کردیم که اصلاً وجود نداره توی فضای آدرس‌دهی پروسه — دقیقاً همون چیزی که با nil pointer اتفاق میفته، چون آدرس 0 هیچوقت به عمد map نمی‌شه (این یک تصمیم طراحی عامدانه توی سیستم‌عامل‌هاست، تا دقیقاً همین باگ‌ها زود detect بشن). addr=0x0 این آدرس حافظه‌ایه که برنامه سعی کرده بهش دسترسی پیدا کنه و باعث خطا شده. اینجا 0x0 یعنی آدرس صفر — که دقیقاً معادل مقدار nil توی Go هست. یعنی وقتی نوشتیم: u.Name و u مقدار nil داشت، Go در سطح پایین سعی کرد بره به آدرس u + offset(Name) که چون u = 0 بود، عملاً شد دسترسی به نزدیکی آدرس 0x0. اگه به جای nil pointer، مشکل یک آرایه‌ی corrupt یا یک pointer arithmetic اشتباه بود، این مقدار به جای 0x0، یک آدرس عجیب و به ظاهر تصادفی (مثل 0x7f8a3c001020) می‌بود که نشون می‌ده به یک ناحیه‌ی حافظه‌ی نامعتبر دیگه (نه صرفاً nil) دسترسی پیدا شده. pc=0x47f1a3 این pc مخفف Program Counterه — آدرس دقیق دستور ماشین (machine instruction) که در لحظه‌ی وقوع خطا داشت اجرا می‌شد. این یک آدرس داخل خود فایل باینری کامپایل‌شده‌ست، نه یک آدرس داده. کاربردش کجاست؟ توی حالت عادی به کارتون نمیاد چون stack trace با نام تابع و شماره‌خط، خودش همین اطلاعات رو خواناتر بهتون می‌ده. ولی اگه بخواید دیباگ خیلی سطح پایین انجام بدید (مثلاً وقتی باینری بدون اطلاعات دیباگ/stripped هست، یا دارید یک core dump رو با ابزاری مثل dlv یا gdb بررسی می‌کنید)، می‌تونید با دستوری مثل: go tool addr2line yourbinary و دادن همین آدرس pc بهش، دقیقاً بفهمید کدوم خط از سورس‌کد به این آدرس ماشین ترجمه شده. چرا Go این جزئیات رو نشون می‌ده؟ چون تفاوت بین code=0x1 (nil pointer معمولی) و code=0x2 (تلاش برای نوشتن روی حافظه‌ی محافظت‌شده) می‌تونه سرنخ مهمی باشه: ا SEGV_MAPERR تقریباً همیشه یعنی nil pointer dereference. ا SEGV_ACCERR نادرتره ولی می‌تونه نشونه‌ی چیزهای پیچیده‌تری باشه، مثل corruption حافظه توی کدهای cgo یا unsafe pointer که اشتباه استفاده شدن. نکته‌ی مهم این خط [signal SIGSEGV...] فقط وقتی توی خروجی panic ظاهر می‌شه که panic از نوع runtime error سطح پایین باشه (مثل nil pointer یا segfault واقعی). اگه panic دستی باشه (مثل panic("custom error") یا panic(errors.New("bad")))، این خط اصلاً نمایش داده نمی‌شه چون سیگنال سیستم‌عاملی رخ نداده — برنامه خودش تصمیم به panic گرفته، نه سیستم‌عامل.
161
15
🔵 عنوان مقاله Introducing Generic Methods 🟢 خلاصه مقاله: در نسخه جدید زبان برنامه‌نویسی Go، ویژگی جالب و مورد انتظار «متدهای عمومی» یا همان «Generic Methods» معرفی شده است. این قابلیت که بسیاری از توسعه‌دهندگان آن را از قبل انتظار داشتند، امکان تعریف متدهای خاص بر روی نوع‌های عمومی را فراهم می‌کند و تحولی مهم در نحوه نوشتن کدهای انعطاف‌پذیر و قابل جمع‌آوری است. در این نسخه، متدهای کانکریت یا مشخص بر روی نوع‌هایی که پارامترهای نوع دارند، حالا به سادگی قابل استفاده هستند و می‌توان متدهای مختلف را بر اساس نوع‌های متفاوت فراخوانی کرد. این تغییر، به توسعه‌دهندگان اجازه می‌دهد تا کدهای قابل‌بازاستفاده و انعطاف‌پذیرتری بنویسند، در حالی که هنوز محدودیت‌هایی هم وجود دارد. یک نکته مهم در این مورد، عدم امکان تعریف متدهای عمومی بر روی واجهات یا اینترفیس‌ها است؛ یعنی هنوز نمی‌توان با استفاده از جنریک، متدهای اینترفیس‌ها را نوع‌پذیر کرد. مارت، یکی از اعضای تیم توسعه، در توضیح این موضوع عنوان می‌کند که این محدودیت برای حفظ انسجام و سادگی پیاده‌سازی است و در آینده ممکن است این قابلیت در قالب‌هایی دیگر گسترش یابد. بنابراین، اگرچه این ویژگی محبوبیت زیادی در جامعه توسعه‌دهندگان پیدا کرده است، اما همچنان در مراحل ابتدایی پیاده‌سازی است و به تدریج امکانات بیشتری به آن اضافه خواهد شد. این تغییر در نسخه 1.27، نشان‌دهنده تمایل تیم Go به حرکت به سمت زبان‌هایی با امکانات بیشتر و تجربه توسعه روان‌تر است. کاربردهای این قابلیت در پروژه‌های بزرگ، توسعه فریم‌ورک‌ها و بهبود قالب کدهای پروژه‌های Open Source است. به طور کلی، معرفی متدهای عمومی گامی بزرگ برای ارتقاء زبان Go و جواب مثبت به نیازهای توسعه‌دهندگان برای ساخت برنامه‌های مدرن، قابل‌اعتماد و مقیاس‌پذیر است. #هوشمندانه_برنامه_نویسی #نسخه_جدید_گو #متدهای_عام #توسعه‌دهندگان 🟣لینک مقاله: https://go.dev/blog/generic-methods ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
166
16
🔵 عنوان مقاله set operations in Go 🟢 خلاصه مقاله: در این مقاله، ابتدا به بررسی عملیات مجموعه‌ای در زبان برنامه‌نویسی Go می‌پردازیم، که یکی از مفاهیم پایه در مدیریت داده‌ها و ساخت ساختارهای پیچیده‌تر است. این عملیات ابزارهایی قدرتمند را برای کار با مجموعه‌ها فراهم می‌کنند و در توسعه برنامه‌های کارآمد و قابل انعطاف نقش مهمی دارند. در بخش بعدی، به ساخت ابزارهای مخصوص برای بازنویسی و بهبود کد در زبان Go می‌پردازیم. این ابزارها کمک می‌کنند تا فرآیند اصلاح و بهبود ساختارهای کد سریع‌تر و حرفه‌ای‌تر انجام گیرد، و توسعه‌دهندگان بتوانند برنامه‌هایی منعطف‌تر و قابل نگهداری‌تر بنویسند. در نهایت، یک بررسی عمیق از دستور `select` در Go را انجام می‌دهیم. این دستور، ابزاری حیاتی در مدیریت همزمانی عملیات‌های مختلف است که قدرت کنترل بر هم‌زمانی برنامه‌های Go را به صورت مؤثری فراهم می‌کند. درک عمیق عملکرد و کاربرد این دستور می‌تواند توسعه برنامه‌های پایدار و کارآمد را تسهیل کند. این مطالب، برای توسعه‌دهندگان و علاقه‌مندان به برنامه‌نویسی در زبان Go، منابع ارزشمندی است تا بتوانند مهارت‌های خود را ارتقاء دهند و برنامه‌هایی بهتر و قابل اعتمادتر بنویسند. #برنامه_نویسی #GoLang #عملیات_مجموعه #هم‌زمانی 🟣لینک مقاله: https://www.youtube.com/watch?v=F1mH6E8cp0M&list=PLGZGLmEvGK8I&index=14 ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
195
17
🚨 آسیب‌پذیری‌های جدید در اکوسیستم Go در روزهای اخیر چند آسیب‌پذیری جدید برای پروژه‌ها و پکیج‌های Go ثبت شده‌اند. مهم‌ترین مورد، GO-2026-6303 در golang.org/x/crypto است که به اعتبارسنجی محدودیت آدرس مبدأ در callbackهای احراز هویت مربوط می‌شود. 🔐 GO-2026-6303 — golang.org/x/crypto 🐛 CVE-2026-56854 — محدودیت source-address در برخی callbackهای احراز هویت بررسی نمی‌شد و در نتیجه می‌توانست نادیده گرفته شود. این مشکل مسیرهای PasswordCallback، KeyboardInteractiveCallback، NoClientAuthCallback GSSAPIWithMICConfig.AllowLogin را تحت تأثیر قرار می‌داد. اکنون این بررسی برای Permissions بازگشتی از تمام callbackهای احراز هویت اعمال می‌شود. 📅 منتشرشده در ۲۸ آگوست ۲۰۲۶ ⚠️ موارد ثبت‌شده دیگر: GO-2026-6301 — آسیب‌پذیری Open Redirect در جریان ورود OIDC پروژه github.com/akuity/kargo GO-2026-6300 — امکان افزایش سطح دسترسی در github.com/mickael-kerjean/filestash GO-2026-6299 — امکان ارتقای دسترسی به Administrator در github.com/statping-ng/statping-ng GO-2026-6298 — آسیب‌پذیری Path Traversal / Broken Access Control در WebDAV پروژه github.com/cloudreve/Cloudreve 🔗 جزئیات: https://pkg.go.dev/vuln/GO-2026-6303 https://pkg.go.dev/vuln/GO-2026-6301 https://pkg.go.dev/vuln/GO-2026-6300 https://pkg.go.dev/vuln/GO-2026-6299 https://pkg.go.dev/vuln/GO-2026-6298
221
18
🔵 عنوان مقاله 20 Talks from GopherCon UK 2026 🟢 خلاصه مقاله: در کنفرانس GopherCon UK 2026، مجموعه‌ای گسترده از سخنرانی‌های با کیفیت و ضبط شده ارائه شد که به موضوعات متنوعی در زمینه برنامه‌نویسی با زبان Go اختصاص یافته بود. این کنفرانس فضای مناسبی برای توسعه‌دهندگان فراهم کرد تا با جدیدترین تکنیک‌ها و روش‌های بهبود کارایی و قابلیت‌های زبان Go آشنا شوند. سخنرانی‌ها در این رویداد شامل مباحثی همچون عملیات مجموعه‌ها در زبان Go، ساخت ابزارهای قدرتمند برای بازسازی و بهبود کدهای Go، و تحلیل عمیق و تخصصی درباره عبارت select بودند. این موضوعات به شرکت‌کنندگان کمک می‌کند تا درک عمیق‌تری از مفاهیم پایه و پیشرفته در برنامه‌نویسی با Go پیدا کنند و مهارت‌های خود را در پروژه‌های عملی به کار ببرند. در سخنرانی مربوط به عملیات مجموعه‌ها، اهمیت مدیریت و عملیات روی داده‌های مختلف در برنامه‌های کاربردی بررسی شد، که برای توسعه‌دهندگان نقش کلیدی در بهبود سرعت و انعطاف‌پذیری برنامه‌ها دارد. سخنرانی دیگر نیز بر توسعه ابزارهای خاص برای refactoring در زبان Go تمرکز داشت، ابزاری که به ease توسعه‌دهندگان در اصلاح، بهبود و نگهداری کدهای موجود کمک می‌کند و فرآیند توسعه را سریع‌تر و مطمئن‌تر می‌سازد. علاوه بر این، تحلیل عمیق در مورد عبارت select، یکی از مهم‌ترین و پرکاربردترین سازوکارهای همزمانی در زبان Go، به توضیح نحوه مدیریت هم‌زمانی، هم‌زمان‌سازی و اجرای همزمان چند عملیات پرداخت. این مجموعه سخنرانی‌ها نشان می‌دهد که جامعه توسعه‌دهندگان Go دائما در حال رشد و پیشرفت است و با اشتراک دانش و تجربیات، مسیر توسعه فناوری‌های مبتنی بر Go را هموار می‌کند. شرکت در چنین رویدادهای علمی و فنی، فرصت مناسبی است برای ارتقاء سطح دانش فنی و تبادل نظر با خبره‌ها و متخصصان این حوزه. #برنامه_نویسی #گوفورکان #زبان_گو #توسعه_نرم‌افزار 🟣لینک مقاله: https://www.youtube.com/playlist?list=PLGZGLmEvGK8I ➖➖➖➖➖➖➖➖ 👑 @gopher_academy
221
19
مراحل کار به این صورت است: ۱. پیدا کردن goroutineهای زنده ابتدا goroutineهای فعال، یعنی goroutineهای runnable یا running، به‌عنوان root در نظر گرفته می‌شوند. فعلاً goroutineهای blocked نادیده گرفته می‌شوند. ۲. ا Mark کردن حافظهٔ قابل‌دسترسی از rootها شروع می‌کنیم و pointerها را دنبال می‌کنیم تا مشخص شود کدام synchronization objectها، مانند channel یا WaitGroup، از این rootها قابل‌دسترسی هستند. ۳. بازگرداندن goroutineهای blocked به rootها تمام goroutineهای blocked بررسی می‌شوند. اگر goroutineای منتظر synchronization resourceای باشد که در مرحلهٔ قبل به‌عنوان reachable علامت‌گذاری شده است، آن goroutine نیز به مجموعهٔ rootها اضافه می‌شود. ۴. تکرار مراحل ۲ و ۳ تا زمانی تکرار می‌شوند که دیگر goroutine جدیدی که روی objectهای قابل‌دسترسی blocked باشد پیدا نشود. ۵. گزارش leakها در نهایت، هر goroutineای که همچنان در حالت blocked باقی مانده باشد، روی resourceای منتظر است که هیچ بخش فعال برنامه به آن دسترسی ندارد؛ بنابراین به‌عنوان leaked گزارش می‌شود. و profileِ goroutineleak هنوز Experimental است و برای فعال‌کردن آن باید هنگام build این گزینه را تنظیم کنید: GOEXPERIMENT=goroutineleakprofile فعال‌کردن این experiment باعث می‌شود این profile از طریق endpointهای net/http/pprof نیز در دسترس باشد: /debug/pprof/goroutineleak طبق گفتهٔ نویسندگان، پیاده‌سازی فعلی از نظر production آماده است. دلیل Experimental بودن آن بیشتر این است که تیم Go می‌خواهد دربارهٔ API بازخورد دریافت کند؛ به‌خصوص دربارهٔ اینکه این قابلیت به‌عنوان یک profile جدید در Go ارائه شود یا خیر.
243
20
🎖Goroutine Leak Profile نشت (Leak) زمانی اتفاق می‌افتد که یک یا چند goroutine برای مدت نامحدود روی synchronization primitiveهایی مانند channelها blocked بمانند، در حالی که goroutineهای دیگر همچنان در حال اجرا هستند و برنامه در مجموع به کار خود ادامه می‌دهد. یک مثال ساده: func leak() <-chan int { out := make(chan int) go func() { out <- 42 // leaks if nobody reads from out }() return out } اگر leak را فراخوانی کنیم اما از channel خروجی چیزی نخوانیم، goroutine داخلی leak برای باقی عمر برنامه هنگام تلاش برای ارسال داده به channel، blocked باقی می‌ماند: func main() { leak() // ... } برخلاف deadlock، نشت goroutine باعث panic نمی‌شود؛ بنابراین تشخیص آن بسیار دشوارتر است. همچنین برخلاف data race، ابزارهای Go برای مدت زیادی راهکار مستقیمی برای شناسایی این مشکل نداشتند. این وضعیت از Go 1.24 با معرفی package جدید synctest شروع به تغییر کرد. خیلی دربارهٔ آن صحبت نمی‌شود، اما synctest ابزار بسیار خوبی برای شناسایی leakها در زمان testing است. حالا Go 1.26 یک profile آزمایشی جدید به نام goroutineleak اضافه کرده که برای گزارش goroutineهای leaked در production طراحی شده است. برای مثال بالا می‌توانیم به شکل زیر از آن استفاده کنیم: func main() { prof := pprof.Lookup("goroutineleak") leak() time.Sleep(50 * time.Millisecond) prof.WriteTo(os.Stdout, 2) // ... } خروجی شامل یک goroutine stack trace مناسب خواهد بود که دقیقاً نشان می‌دهد leak در کجا اتفاق افتاده است. درواقعه goroutineleak چگونه leak را پیدا می‌کند؟ این profileِ goroutineleak برای پیدا کردن leakها از mark phase در Garbage Collector استفاده می‌کند تا مشخص کند کدام goroutineهای blocked همچنان به کد فعال برنامه متصل هستند. الگوریتم از goroutineهای runnable شروع می‌کند، تمام synchronization objectهایی را که از طریق آن‌ها قابل دسترسی هستند mark می‌کند و سپس هر goroutineِ blockedای را که روی یکی از آن objectها منتظر است، به مجموعهٔ rootها اضافه می‌کند. این فرآیند تا زمانی ادامه پیدا می‌کند که دیگر goroutine جدیدی پیدا نشود. در پایان، هر goroutineِ blocked که باقی مانده باشد، روی resourceای منتظر است که از هیچ بخش فعال برنامه قابل‌دسترسی نیست؛ بنابراین به‌عنوان leaked goroutine در نظر گرفته می‌شود. خلاصهٔ الگوریتم [ Start: GC mark phase ] │ │ 1. Collect live goroutines v ┌───────────────────────┐ │ Initial roots │ <────────────────┐ │ (runnable goroutines) │ │ └───────────────────────┘ │ │ │ │ 2. Mark reachable memory │ v │ ┌───────────────────────┐ │ │ Reachable objects │ │ │ (channels, mutexes) │ │ └───────────────────────┘ │ │ │ │ 3a. Check blocked goroutines │ v │ ┌───────────────────────┐ (Yes) │ │ Is blocked G waiting │ ─────────────────┘ │ on a reachable obj? │ 3b. Add G to roots └───────────────────────┘ │ │ (No - repeat until no new Gs found) v ┌───────────────────────┐ │ Remaining blocked │ │ goroutines │ └───────────────────────┘ │ │ 5. Report the leaks v [ LEAKED! ] (Blocked on unreachable synchronization objects)
196