Go делает одну крутую вещь за вас — при объявлении переменных они всегда получают предсказуемое zero value:
0, false, "" или nil.Многие программисты зря делают
make() или явно инициализируют структуры, добавляя лишний код. А значит — повышают вероятность появления багов и забытых для инициализации полей.Стоит проектировать типы так, чтобы их zero value сразу был полезен. Например,
sync.Mutex готов к работе «из коробки»:
package main
import "sync"
type MyInt struct {
mu sync.Mutex
val int
}
func main() {
var i MyInt
i.mu.Lock()
i.val++
i.mu.Unlock()
}
То же самое с
bytes.Buffer: можно просто объявить переменную и сразу писать в неё:
package main
import "bytes"
import "io"
import "os"
func main() {
var b bytes.Buffer
b.Write([]byte("Hello world"))
io.Copy(os.Stdout, &b)
}
Слайсы? Их zero value —
nil, но это не мешает их использовать:
package main
import "fmt"
import "strings"
func main() {
// s := make([]string, 0)
// s := []string{}
var s []string
s = append(s, "Hello")
s = append(s, "world")
fmt.Println(strings.Join(s, " "))
}
А ещё на nil-указателях можно вызывать методы:
package main
import "fmt"
type Config struct {
path string
}
func (c *Config) Path() string {
if c == nil {
return "/usr/home"
}
return c.path
}
func main() {
var c1 *Config
var c2 = &Config{
path: "/export",
}
fmt.Println(c1.Path(), c2.Path())
}
При проектировании своих структур подумайте — что должен делать zero value вашего типа? Если ответ «ничего полезного» — возможно, стоит пересмотреть дизайн.
#go_tips@go_for_devs