Vladyslav Krylasov's website

Go: new vs make

Published on

Contents

Difference between — new vs make in Go can be confusing at first, but here’s a simple breakdown:

new(T)

  • Allocates memory for a value of type T
  • Returns a pointer to zero-initialized value of type T
  • Works for any type

Example

p := new(int)  // p is of type *int
fmt.Println(*p) // 0 (default int value)
*p = 42
fmt.Println(*p) // 42

Use new when you want a pointer to a value of any type.

make(T, ...)

  • Creates and initializes built-in reference types:
    • slice
    • map
    • channel
  • Returns the value, not a pointer
  • Can’t be used with structs or other basic types

Example

s := make([]int, 3)  // slice with length 3
fmt.Println(s)       // [0 0 0]
s[0] = 10
fmt.Println(s)       // [10 0 0]

Use make when you want to create a slice, map, or channel that’s ready to use.

Summary Table

Feature new make
Returns Pointer Value
Usable with Any type Only: slice, map, channel
Zero value Yes Initialized, ready to use
Example type int, struct []int, map[string]int