In Go, is there a notable difference between the following two segments of code:
v := &Vector{}
as opposed to
v := new(Vector)
In Go, is there a notable difference between the following two segments of code:
v := &Vector{}
as opposed to
v := new(Vector)
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
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
Here is a difference: for a Person
struct, the JSON string marshalled from &[]*Person{}
is []
and from new([]*Person)
is null
using json.Marshal
.
Check out the sample here: https://play.golang.org/p/xKkFLoMXX1s