From: Robert Griesemer Date: Fri, 10 May 2019 00:35:29 +0000 (-0700) Subject: spec: clarify the difference between &T{} and new(T) X-Git-Tag: go1.13beta1~309 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=eebb9db0ef1a4cad2f5dd7e8b90f699a1d50bf91;p=gostls13.git spec: clarify the difference between &T{} and new(T) Add a small paragraph and example pointing out the difference for the case where T is a slice or map. This is a common error for Go novices. Fixes #29425. Change-Id: Icdb59f25361e9f6a09b190fbfcc9ae0c7d90077b Reviewed-on: https://go-review.googlesource.com/c/go/+/176338 Reviewed-by: Matthew Dempsky --- diff --git a/doc/go_spec.html b/doc/go_spec.html index 158146b9c0..dea3afe498 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -2513,10 +2513,24 @@ For array and slice literals the following rules apply: generates a pointer to a unique variable initialized with the literal's value.

+
 var pointer *Point3D = &Point3D{y: 1000}
 
+

+Note that the zero value for a slice or map +type is not the same as an initialized but empty value of the same type. +Consequently, taking the address of an empty slice or map composite literal +does not have the same effect as allocating a new slice or map value with +new. +

+ +
+p1 := &[]int{}    // p1 points to an initialized, empty slice with value []int{} and length 0
+p2 := new([]int)  // p2 points to an uninitialized slice with value nil and length 0
+
+

The length of an array literal is the length specified in the literal type. If fewer elements than the length are provided in the literal, the missing