Gopher Academy
3.88K subscribers
927 photos
40 videos
280 files
2.09K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
برنامه هایی که با گولنگ نوشته میشن یک از شایع ترین خطاهایی که در runtime و روی production باهاش مواجه میشن خطای panic از جنس nil pointer هست. که میتونه منجر به از کار افتادن برنامه هم بشه، هر چند راه هایی وجود داره که شما بتونید panic رو recover کنید، اما اصولا جواب بهتر اینه که سعی کنید قسمت هایی از کد که باعث ایجاد این دسته از panic ها میشن رو شناسایی کنید و مشکل رو از ریشه حل کنید.


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
👍2🍾2
35% OFF USE COUPON: BLACKFRIDAY2023

🕊 @gopher_academy
🍾3👍2
🔷️ git 2.43.0 is here!

😉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:

// 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.

type Person struct {
Name string
Age int
}

func (p *Person) AddAge() {
p.Age++
}

func (p *Person) Rename(name string) {
p.Name = name
}
If you’re looking to add age to a person and then rename them, the typical approach is as follows:

func main() {
p := Person{Name: "Aiden", Age: 30}

p.AddAge()
p.Rename("Aiden 2")
}
Alternatively, we can modify the AddAge and Rename function receivers to return the modified object itself, even if they don’t typically return anything.

func (p *Person) AddAge() *Person {
p.Age++
return p
}

func (p *Person) Rename(name string) *Person {
p.Name = name
return p
}
By returning the modified object itself, we can easily chain multiple function receivers together without having to add unnecessary lines of code:

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
👍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.

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.

👇👇👇👇

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:

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 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
👍10🍾3
1699819945758.pdf
322.2 KB
پروداکشن رفت تو دیوار!

امیدوارم هیچ وقت این جمله رو نشنوید :‌))

ریلیز نسخه جدید، میتونه ریسک زیادی داشته باشه
به خصوص اگر محصول scale بزرگی داره یا پروژه‌ای مشترک بین چند تا تیم هست

نمیشه ریسک ریلیز صفر کرد اما میتونیم این ریسک رو به حداقل برسونیم
توی این اسلاید‌ها سعی کردم کلیدی ترین نکته‌هایی که میشه به کمک اونا ریلیز بهتری داشته باشیم، بنویسم.

خیلی دوست دارم تجربه و نظرتون رو بشنوم و اگر موردی به ذهنتون میرسه حتما کامنت کنید!

🕊 @gopher_academy | @GolangEngineers
🍾43👍2
Ternary with generic

#tips #tricks

Go does not have built-in support for ternary operators like many other programming languages:

# python 
min = a if a < b else b

# c#
min = x < y ? x : y
With 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:

// 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 sync.Mutex or sync.RWMutex.

You gain some benefits using a sync.RWMutex with read-heavy operations on the map.

var (
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()
Instead of using a map mutex pair, you can use sync.Map:

var s sync.Map

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
})
If you feel uneasy about the use of any in all sync.Map functions, you could define a generic wrapper:

type Map[K any, V any] struct {
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)
}
And then use the wrapper instead:

var s Map[int, bool]

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
})
One caveat is that the Range function is different from holding a lock around the range loop in the 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!

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
How do message queue evolve?

🕊 @gopher_academy | @GolangEngineers
2👍1🕊1
System design cheat sheet

🕊 @gopher_academy | @GolangEngineers
👍10
سم آلتمن به OpenAI برگشت و اعضای هیئت‌مدیره اخراج شدند

🔷️https://www.zoomit.ir/business/411998-sam-altman-returns-ceo-open-ai/


🕊 @gopher_academy | @GolangEngineers
🔥6🍾1💊1