Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a difference between new() and "regular" allocation?

Tags:

go

In Go, is there a notable difference between the following two segments of code:

v := &Vector{}

as opposed to

v := new(Vector)
like image 534
Lincoln Bergeson Avatar asked Nov 06 '12 05:11

Lincoln Bergeson


2 Answers

No. What they return is the same,

package main

import "fmt"
import "reflect"

type Vector struct {
    x   int
    y   int
}

func main() {
    v := &Vector{}
    x := new(Vector)
    fmt.Println(reflect.TypeOf(v))
    fmt.Println(reflect.TypeOf(x))
}

Result:

*main.Vector
*main.Vector

There is some contention on the mailing list that having both is confusing:

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs

One thing to note:

new() is the only way to get a pointer to an unnamed integer or other basic type. You can write "p := new(int)" but you can't write "p := &int{0}". Other than that, it's a matter of preference.

Source : https://groups.google.com/d/msg/golang-nuts/793ZF_yeqbk/-zyUAPT-e4IJ

like image 197
minikomi Avatar answered Oct 22 '22 21:10

minikomi


Yes, there is a fundamental difference between the two code fragments.

v := &Vector{}

Works only for Vector being a struct type, map type, array type or a slice type

v := new(Vector)

Works for Vector of any type.

Example: http://play.golang.org/p/nAHjL1ZEuu

like image 26
zzzz Avatar answered Oct 22 '22 20:10

zzzz