]> Cypherpunks repositories - gostls13.git/commitdiff
spec: ignore struct tags when converting structs
authorRobert Griesemer <gri@golang.org>
Fri, 3 Jun 2016 20:21:55 +0000 (13:21 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 4 Oct 2016 17:07:37 +0000 (17:07 +0000)
This is a backwards-compatible language change.

Per the proposal (#16085), the rules for conversions are relaxed
such that struct tags in any of the structs involved in the conversion
are ignored (recursively).

Because this is loosening the existing rules, code that compiled so
far will continue to compile.

For #16085.
Fixes #6858.

Change-Id: I0feef651582db5f23046a2331fc3f179ae577c45
Reviewed-on: https://go-review.googlesource.com/24190
Reviewed-by: Russ Cox <rsc@golang.org>
doc/go_spec.html

index 1d0ea22c7cf22dab6633889600b65d8b059b31ec..6e07c945e173bce91a01a94e1679588624377bbd 100644 (file)
@@ -1,6 +1,6 @@
 <!--{
        "Title": "The Go Programming Language Specification",
-       "Subtitle": "Version of September 1, 2016",
+       "Subtitle": "Version of October 4, 2016",
        "Path": "/ref/spec"
 }-->
 
@@ -3837,10 +3837,12 @@ in any of these cases:
        to <code>T</code>.
        </li>
        <li>
-       <code>x</code>'s type and <code>T</code> have identical
+       ignoring struct tags (see below),
+       <code>x</code>'s type and <code>T</code> have <a href="#Type_identity">identical</a>
        <a href="#Types">underlying types</a>.
        </li>
        <li>
+       ignoring struct tags (see below),
        <code>x</code>'s type and <code>T</code> are unnamed pointer types
        and their pointer base types have identical underlying types.
        </li>
@@ -3860,6 +3862,31 @@ in any of these cases:
        </li>
 </ul>
 
+<p>
+<a href="#Struct_types">Struct tags</a> are ignored when comparing struct types
+for identity for the purpose of conversion:
+</p>
+
+<pre>
+type Person struct {
+       Name    string
+       Address *struct {
+               Street string
+               City   string
+       }
+}
+
+var data *struct {
+       Name    string `json:"name"`
+       Address *struct {
+               Street string `json:"street"`
+               City   string `json:"city"`
+       } `json:"address"`
+}
+
+var person = (*Person)(data)  // ignoring tags, the underlying types are identical
+</pre>
+
 <p>
 Specific rules apply to (non-constant) conversions between numeric types or
 to and from a string type.