Go - Versus
:= vs =
k := 1 is equivalent to var k int = 1:
- no need to specify type when using
:= :=construct can only be used inside a function, while avarstatement can be at package or function level.- constants cannot be declared using
:=, it has to useconstkeyword:const name = "foo".
make vs new
Go has a special make function that can be used to initialize channels, slices, and maps.
makeis able to allocate variable memory and returns an instance of the provided type.newcan only initialize empty instances, and returns a pointer of the provided argument.
// returns a slice with 3 `0`s
s1 := make([]int, 3)
// returns a pointer to an empty slice
s2 := new([]int)
fmt.Println(s1) // [0 0 0]
fmt.Println(s2) // &[]
array vs slice
Slice: Under the covers, it is a struct value holding a pointer and a length
type sliceHeader struct {
Length int
ZerothElement *byte
}
Use make to create a slice: it allocates a new array and creates a slice header to describe it, all at once.
How to tell slice from array
a := [4]int{3, 4, 5, 6}
b := a[:]
fmt.Printf("%T %T\n", a, b) // [4]int []int
fmt.Println(reflect.TypeOf(a).Kind(), reflect.TypeOf(b).Kind()) // array slice
vendor vs third-party
Many Go projects have both a vendor folder and a third-party folder (like Kubernetes).
They are all external dependencies, the difference is that vendor folder managed by the go mod vendor command, the dependencies can be specified in go.mod; while third-party is not managed automatically.