Skip to content

Latest commit

 

History

History
221 lines (160 loc) · 3.39 KB

STYLE.md

File metadata and controls

221 lines (160 loc) · 3.39 KB

Go Style Guide

Style Guide ini ada sebagai pedoman dalam ngoding Go berdasarkan aspek best practice, memory safety dan performance.

Content

Integer

Human Readable

Kita bisa menggunakan underscore untuk mempermudah membaca number

BadGood
number := 10000000
better := 10_000_000

Mutex

Deklarasi Mutex

Deklarasi mutex tidak perlu menggunakan pointer karena dia zero value, pointer hanya akan meningkatkan kompleksitas.

BadGood
mu := new(sync.Mutex)
mu.Lock()
var mu sync.Mutex
mu.Lock()

Deklarasi Mutex di struct

Tidak diperbolehkan mengembed mutex di struct karena Lock dan Unlock belong to mutex dan bukan struct nya.

BadGood
type SMap struct {
sync.Mutex

data map[string]string
}

func NewSMap() *SMap {
return &SMap{
data: make(map[string]string),
}
}

func (m *SMap) Get(k string) string {
m.Lock()
defer m.Unlock()

return m.data[k]
}
type SMap struct {
mu sync.Mutex

data map[string]string
}

func NewSMap() *SMap {
return &SMap{
data: make(map[string]string),
}
}

func (m *SMap) Get(k string) string {
m.mu.Lock()
defer m.mu.Unlock()

return m.data[k]
}

Slice & Map

Updating slice & map across function

Ketika kita pass slice & map ke function, sebenarnya dia pass by reference. Sehingga jika ada update value di dalam function, variable awal juga akan berubah

BadGood
func (d *Driver) SetTrips(trips []Trip) {
d.trips = trips
}

trips := ...
d1.SetTrips(trips)

// Did you mean to modify d1.trips?
trips[0] = ...
func (d *Driver) SetTrips(trips []Trip) {
d.trips = make([]Trip, len(trips))
copy(d.trips, trips)
}

trips := ...
d1.SetTrips(trips)

// We can now modify trips[0] without affecting d1.trips.
trips[0] = ...

Getting map & slice from function

Begitu pula data yang diambil dari slice dia juga pass by reference

BadGood
type Stats struct {
mu sync.Mutex
counters map[string]int
}

// Snapshot returns the current stats.
func (s *Stats) Snapshot() map[string]int {
s.mu.Lock()
defer s.mu.Unlock()

return s.counters
}

// snapshot is no longer protected by the mutex, so any
// access to the snapshot is subject to data races.
snapshot := stats.Snapshot()
type Stats struct {
mu sync.Mutex
counters map[string]int
}

func (s *Stats) Snapshot() map[string]int {
s.mu.Lock()
defer s.mu.Unlock()

result := make(map[string]int, len(s.counters))
for k, v := range s.counters {
result[k] = v
}
return result
}

// Snapshot is now a copy.
snapshot := stats.Snapshot()

Test

Bedakan nama package untuk test file

Dalam 1 folder kita bisa memiliki nama package yang berbeda misal user untuk base user dan user_test untuk file unit test user. Hal ini berfungsi agar unexported function tidak muncul.

Sorting variable berdasarkan size tipe data