📥 دریافت شده از: Vesal Behrouzi
-------------
داشتم میگفتم وقتی میرید به شرکت جدید به جای حل کردن مشکلاتی که وجود ندارند، اولویت ندارن یا ازتون خواسته نشده و... یه 6 ماهی آروم بشینید و فقط نگاه کنید تا فضا و اتمسفر دستتون بیاد، اولویتها رو بهتر درک کنید، ساختار شرکت و مشکلات رو بهتر بشناسید، بعد یواش یواش میتونید شروع کنید به انجام کارهایی که فرای انتظاراتی هستند که بابتش استخدام شدید، خلاصه در همین راستا از اتاق فرمان شرح انتظارات شغل Staff Engineer شرکت داکر رو هم برای ما فرستادن که جهت استحضار به پیوست ضمیمه شود.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
-------------
داشتم میگفتم وقتی میرید به شرکت جدید به جای حل کردن مشکلاتی که وجود ندارند، اولویت ندارن یا ازتون خواسته نشده و... یه 6 ماهی آروم بشینید و فقط نگاه کنید تا فضا و اتمسفر دستتون بیاد، اولویتها رو بهتر درک کنید، ساختار شرکت و مشکلات رو بهتر بشناسید، بعد یواش یواش میتونید شروع کنید به انجام کارهایی که فرای انتظاراتی هستند که بابتش استخدام شدید، خلاصه در همین راستا از اتاق فرمان شرح انتظارات شغل Staff Engineer شرکت داکر رو هم برای ما فرستادن که جهت استحضار به پیوست ضمیمه شود.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
👍19🔥3🕊1
برنامه هایی که با گولنگ نوشته میشن یک از شایع ترین خطاهایی که در runtime و روی production باهاش مواجه میشن خطای panic از جنس nil pointer هست. که میتونه منجر به از کار افتادن برنامه هم بشه، هر چند راه هایی وجود داره که شما بتونید panic رو recover کنید، اما اصولا جواب بهتر اینه که سعی کنید قسمت هایی از کد که باعث ایجاد این دسته از panic ها میشن رو شناسایی کنید و مشکل رو از ریشه حل کنید.
شرکت Uber اخیر مقاله ای منتشر کرده که در این مورد توضیحات خوبی رو ارائه داده، دوست داشتید مطالعه کنید.
NilAway: Practical Nil Panic Detection for Go
یه پروژه open-source هم در همین رابطه منشتر کرده که من روی یکی از پروژه هام اجراش کردم و کلی statement پیدا کرد که این مشکل رو داره احتمالا.
خودش هشدار داده که پروژه در دست توسعه ست و ممکنه خطای false positive داشته باشید، ولی بد نیست به پروسه ci اضافه بشه یا حداقل لوکال چک کنید.
نصب و اجراشم ساده ست.
#gocasts
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
panic: runtime error: invalid memory address or nil pointer dereference
شرکت Uber اخیر مقاله ای منتشر کرده که در این مورد توضیحات خوبی رو ارائه داده، دوست داشتید مطالعه کنید.
NilAway: Practical Nil Panic Detection for Go
یه پروژه open-source هم در همین رابطه منشتر کرده که من روی یکی از پروژه هام اجراش کردم و کلی statement پیدا کرد که این مشکل رو داره احتمالا.
خودش هشدار داده که پروژه در دست توسعه ست و ممکنه خطای false positive داشته باشید، ولی بد نیست به پروسه ci اضافه بشه یا حداقل لوکال چک کنید.
نصب و اجراشم ساده ست.
go install go.uber.org/nilaway/cmd/nilaway@latest
nilaway ./...
#gocasts
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
👍16🍾1
با استفاده از این هلم چارت میتونید انواع سرویسها (از جمله دیتابیس، بک اند، فرانت و وب سرور) رو روی کوبرنتیز دیپلوی کنید بدون این که نیاز باشه برای هر کدوم چارت جدا بنویسید.
https://github.com/aahemm/helm-microservice
تو این مقالهی ویرگول هم بیشتر توضیح داده شده:
https://vrgl.ir/yav68
#DevTwitter | <Aliakbar Hemmati/>
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
https://github.com/aahemm/helm-microservice
تو این مقالهی ویرگول هم بیشتر توضیح داده شده:
https://vrgl.ir/yav68
#DevTwitter | <Aliakbar Hemmati/>
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
👍2🍾2
🔷️ git 2.43.0 is here!
😉https://github.blog/2023-11-20-highlights-from-git-2-43/
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
😉https://github.blog/2023-11-20-highlights-from-git-2-43/
➖➖➖➖➖➖➖➖
🕊 @gopher_academy
👍2🍾2🔥1🕊1
Slice pre-allocation
#tips #tricks
Did you know that it’s possible to use a pre-allocated slice without specifying the length of the array (zero). This allows us to use append just like we would:
🕊 @gopher_academy | @GolangEngineers
#tips #tricks
Did you know that it’s possible to use a pre-allocated slice without specifying the length of the array (zero). This allows us to use append just like we would:
// instead of➖➖➖➖➖➖➖➖
a := make([]int, 10)
a[0] = 1
// use this
b := make([]int, 0, 10)
b = append(b, 1)
🕊 @gopher_academy | @GolangEngineers
🔥1🕊1🍾1💊1
Chaining technique
#tips #tricks
The technique of chaining can be applied to function (pointer) receivers. To illustrate this, let’s consider a Person struct with two functions, AddAge and Rename, that can be used to modify it.
🕊 @gopher_academy | @GolangEngineers
#tips #tricks
The technique of chaining can be applied to function (pointer) receivers. To illustrate this, let’s consider a Person struct with two functions, AddAge and Rename, that can be used to modify it.
type Person struct {If you’re looking to add age to a person and then rename them, the typical approach is as follows:
Name string
Age int
}
func (p *Person) AddAge() {
p.Age++
}
func (p *Person) Rename(name string) {
p.Name = name
}
func main() {Alternatively, we can modify the AddAge and Rename function receivers to return the modified object itself, even if they don’t typically return anything.
p := Person{Name: "Aiden", Age: 30}
p.AddAge()
p.Rename("Aiden 2")
}
func (p *Person) AddAge() *Person {By returning the modified object itself, we can easily chain multiple function receivers together without having to add unnecessary lines of code:
p.Age++
return p
}
func (p *Person) Rename(name string) *Person {
p.Name = name
return p
}
p = p.AddAge().Rename("Aiden 2")➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍8🔥2🍾2
♻️Golang Weekly
♻️#485 — NOVEMBER 21, 2023
♻️https://golangweekly.com/issues/485
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
♻️#485 — NOVEMBER 21, 2023
♻️https://golangweekly.com/issues/485
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍2🍾2
♻️Official code style, effective, best practices in Go
🌷The Go Style Guide and accompanying documents codify the current best approaches for writing readable and idiomatic Go. Adherence to the Style Guide is not intended to be absolute, and these documents will never be exhaustive. Our intention is to minimize the guesswork of writing readable Go so that newcomers to the language can avoid common mistakes. The Style Guide also serves to unify the style guidance given by anyone reviewing Go code at Google.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
🌷The Go Style Guide and accompanying documents codify the current best approaches for writing readable and idiomatic Go. Adherence to the Style Guide is not intended to be absolute, and these documents will never be exhaustive. Our intention is to minimize the guesswork of writing readable Go so that newcomers to the language can avoid common mistakes. The Style Guide also serves to unify the style guidance given by anyone reviewing Go code at Google.
https://google.github.io/styleguide/go/index
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍3🕊2
♻️Optimized Code Is Not Readable♻️
🌷Undoubtedly, one of the most critical qualities of software code is its readability.
👇👇👇👇
👑 Book: Efficient Go
Data-Driven Performance Optimizations
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
🌷Undoubtedly, one of the most critical qualities of software code is its readability.
👇👇👇👇
It is more important to make the purpose of the code unmistakable than to display virtuosity.... The problem with obscure code is that debugging and
modification become much more difficult, and these are already the
hardest aspects of computer programming. Besides, there is the added
danger that a too clever program may not say what you thought it said.
👑 Book: Efficient Go
Data-Driven Performance Optimizations
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
❤4👍1💊1
Using import with ‘_’ for package initialization
#tips #tricks
Sometimes, in libraries, you may come across import statements that combine an underscore (_) like this:
Let’s consider an example to better understand how it works:
🕊 @gopher_academy | @GolangEngineers
#tips #tricks
Sometimes, in libraries, you may come across import statements that combine an underscore (_) like this:
import ( _ "google.golang.org/genproto/googleapis/api/annotations" )This will execute the initialization code (init function) of the package, without creating a name reference for it. This allows you to initialize packages, register connections, and perform other tasks before running the code.
Let’s consider an example to better understand how it works:
// underscore➖➖➖➖➖➖➖➖
package underscore
func init() {
fmt.Println("init called from underscore package")
}
// mainpackage main
import (
_ "lab/underscore"
)
func main() {}
// log: init called from underscore package
🕊 @gopher_academy | @GolangEngineers
👍5🍾2🔥1
Use import with dot .
#tips #tricks
Having explored how we can use import with underscore, let’s now look at how the dot . operator is more commonly used.
As a developer, the dot . operator can be used to make the exported identifiers of an imported package available without having to specify the package name, which can be a helpful shortcut for lazy developers.
Pretty cool, right? This is especially useful when dealing with long package names in our projects, such as
To demonstrate, here’s a brief example:
🕊 @gopher_academy | @GolangEngineers
#tips #tricks
Having explored how we can use import with underscore, let’s now look at how the dot . operator is more commonly used.
As a developer, the dot . operator can be used to make the exported identifiers of an imported package available without having to specify the package name, which can be a helpful shortcut for lazy developers.
Pretty cool, right? This is especially useful when dealing with long package names in our projects, such as
externalmodel
or doingsomethinglonglib
To demonstrate, here’s a brief example:
package main➖➖➖➖➖➖➖➖
import (
"fmt"
. "math"
)
func main() {
fmt.Println(Pi) // 3.141592653589793
fmt.Println(Sin(Pi / 2)) // 1
}
🕊 @gopher_academy | @GolangEngineers
👍8🍾2💊1
✅ دورهمی هفته دوازدهم
این هفته بصورت مقدماتی به موضوع کریپتوگرافی کلید عمومی می پردازیم که یکی از اساسی ترین موضوع دنیای رمزنگاری و بلاکچین هست.
- موضوع: An introduction to the public-key cryptography
- تاریخ و ساعت: ۹ آذر ساعت ۷ شب
- اسپانسر: GoBridge
- ارائه دهنده: مهندس مصطفی صداقت جو (توسعه دهنده و Maintainer پروژه بلاکچین Pactus )
- محل برگزاری: پلت فرم zoom و گوگل میت
➖➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
این هفته بصورت مقدماتی به موضوع کریپتوگرافی کلید عمومی می پردازیم که یکی از اساسی ترین موضوع دنیای رمزنگاری و بلاکچین هست.
- موضوع: An introduction to the public-key cryptography
- تاریخ و ساعت: ۹ آذر ساعت ۷ شب
- اسپانسر: GoBridge
- ارائه دهنده: مهندس مصطفی صداقت جو (توسعه دهنده و Maintainer پروژه بلاکچین Pactus )
- محل برگزاری: پلت فرم zoom و گوگل میت
➖➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍10🍾3
1699819945758.pdf
322.2 KB
پروداکشن رفت تو دیوار!
امیدوارم هیچ وقت این جمله رو نشنوید :))
ریلیز نسخه جدید، میتونه ریسک زیادی داشته باشه
به خصوص اگر محصول scale بزرگی داره یا پروژهای مشترک بین چند تا تیم هست
نمیشه ریسک ریلیز صفر کرد اما میتونیم این ریسک رو به حداقل برسونیم
توی این اسلایدها سعی کردم کلیدی ترین نکتههایی که میشه به کمک اونا ریلیز بهتری داشته باشیم، بنویسم.
خیلی دوست دارم تجربه و نظرتون رو بشنوم و اگر موردی به ذهنتون میرسه حتما کامنت کنید!
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
امیدوارم هیچ وقت این جمله رو نشنوید :))
ریلیز نسخه جدید، میتونه ریسک زیادی داشته باشه
به خصوص اگر محصول scale بزرگی داره یا پروژهای مشترک بین چند تا تیم هست
نمیشه ریسک ریلیز صفر کرد اما میتونیم این ریسک رو به حداقل برسونیم
توی این اسلایدها سعی کردم کلیدی ترین نکتههایی که میشه به کمک اونا ریلیز بهتری داشته باشیم، بنویسم.
خیلی دوست دارم تجربه و نظرتون رو بشنوم و اگر موردی به ذهنتون میرسه حتما کامنت کنید!
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
🍾4❤3👍2
Ternary with generic
#tips #tricks
Go does not have built-in support for ternary operators like many other programming languages:
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
#tips #tricks
Go does not have built-in support for ternary operators like many other programming languages:
# pythonWith Go’s generics in version 1.18, we now have the ability to create a utility that allows for ternary-like functionality in just a single line of code:
min = a if a < b else b
# c#
min = x < y ? x : y
// our utility
func Ter[T any](cond bool, a, b T) T {
if cond {
return a
}
return b
}
func main() {
fmt.Println(Ter(true, 1, 2)) // 1
fmt.Println(Ter(false, 1, 2)) // 2
}
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍8🍾3
Synchronize a map
#tips #tricks
To synchronize a map, you will see code that uses a
You gain some benefits using a
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
#tips #tricks
To synchronize a map, you will see code that uses a
sync.Mutex
or sync.RWMutex
.You gain some benefits using a
sync.RWMutex
with read-heavy operations on the map.var (Instead of using a map mutex pair, you can use sync.Map:
s map[int]bool
m sync.RWMutex
)
for i := 0; i < 7; i++ {
go func(i int) {
m.Lock()
defer m.Unlock()
s[i] = true
}(i)
}
// Elsewhere
m.RLock()
for k, v := range s {
fmt.Println(k, v)
}
m.RUnlock()
var s sync.MapIf you feel uneasy about the use of any in all
for i := 0; i < 7; i++ {
go func(i int) {
s.Store(i, true)
}(i)
}
// Elsewhere
s.Range(func(k, v any) bool {
fmt.Println(k.(int), v.(bool))
return true
})
sync.Map
functions, you could define a generic wrapper:type Map[K any, V any] struct {And then use the wrapper instead:
m sync.Map
}
func (m *Map[K, V]) Load(key K) (V, bool) {
v, ok := m.m.Load(key)
return v.(V), ok
}
func (m *Map[K, V]) Range(fn func(key K, value V) bool) {
m.m.Range(func(key, value any) bool {
return fn(key.(K), value.(V))
})
}
func (m *Map[K, V]) Store(key K, value V) {
m.m.Store(key, value)
}
var s Map[int, bool]One caveat is that the Range function is different from holding a lock around the range loop in the
for i := 0; i < 7; i++ {
go func(i int) {
s.Store(i, true)
}(i)
}
// Elsewhere
s.Range(func(k int, v bool) bool {
fmt.Println(k, v)
return true
})
sync.RWMutex
example. Range does not necessarily correspond to any consistent snapshot of the map’s contents.➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
❤6💊2
♻️READABILITY IS IMPORTANT!
👑 Book: Efficient Go
Data-Driven Performance Optimizations
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
It’s easier to optimize readable code than make heavily optimized code readable. This is
true for both humans and compilers that might attempt to optimize your code!
👑 Book: Efficient Go
Data-Driven Performance Optimizations
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍4💊1