internal/history: rename Version to GoVer

Make it more clear that this type represents a Go-specific version,
rather than a version that follows the Semantic Versioning 2.0.0
specification. The type already has Go-specific methods, for example
IsMajor reports true for "1.14" and IsMinor reports true for "1.14.1".
This is consistent with the terminology used by Go releases, but
very surprising if considered from the perspective of semver.

Document some differences of the Go-specific version convention
compared to semver, and describe the X, Y, Z fields in more detail.

This change makes it viable to add a String method to GoVer type
documented to print a Go-specific version string, which will be
useful in more places in CL 229483.

For golang/go#32450.

Change-Id: If7482fdb4a739ff5b89b7133402d94412057f590
Reviewed-on: https://go-review.googlesource.com/c/website/+/229481
Reviewed-by: Carlos Amedee <carlos@golang.org>
diff --git a/cmd/golangorg/release.go b/cmd/golangorg/release.go
index 69bc39f..61def3f 100644
--- a/cmd/golangorg/release.go
+++ b/cmd/golangorg/release.go
@@ -78,9 +78,9 @@
 // sortReleases returns a sorted list of Go releases, suitable to be
 // displayed on the Release History page. Releases are arranged into
 // major releases, each with minor revisions.
-func sortReleases(rs map[history.Version]history.Release) []Major {
+func sortReleases(rs map[history.GoVer]history.Release) []Major {
 	var major []Major
-	byMajorVersion := make(map[history.Version]Major)
+	byMajorVersion := make(map[history.GoVer]Major)
 	for v, r := range rs {
 		switch {
 		case v.IsMajor():
@@ -108,8 +108,8 @@
 
 // majorOf takes a Go version like 1.5, 1.5.1, 1.5.2, etc.,
 // and returns the corresponding major version like 1.5.
-func majorOf(v history.Version) history.Version {
-	return history.Version{X: v.X, Y: v.Y, Z: 0}
+func majorOf(v history.GoVer) history.GoVer {
+	return history.GoVer{X: v.X, Y: v.Y, Z: 0}
 }
 
 type releaseTemplateData struct {
@@ -125,20 +125,13 @@
 
 // Release represents a Go release entry as displayed on the release history page.
 type Release struct {
-	ver history.Version
+	ver history.GoVer
 	rel history.Release
 }
 
 // V returns the Go release version string, like "1.14", "1.14.1", "1.14.2", etc.
 func (r Release) V() string {
-	switch {
-	case r.ver.Z != 0:
-		return fmt.Sprintf("%d.%d.%d", r.ver.X, r.ver.Y, r.ver.Z)
-	case r.ver.Y != 0:
-		return fmt.Sprintf("%d.%d", r.ver.X, r.ver.Y)
-	default:
-		return fmt.Sprintf("%d", r.ver.X)
-	}
+	return r.ver.String()
 }
 
 // Date returns the date of the release, formatted for display on the release history page.
diff --git a/internal/history/release.go b/internal/history/release.go
index 56161a2..e7c4487 100644
--- a/internal/history/release.go
+++ b/internal/history/release.go
@@ -6,6 +6,7 @@
 package history
 
 import (
+	"fmt"
 	"html/template"
 	"time"
 )
@@ -29,7 +30,7 @@
 //
 // It contains entries for releases of Go 1.9 and newer.
 // Older releases are listed in doc/devel/release.html.
-var Releases = map[Version]Release{
+var Releases = map[GoVer]Release{
 	{1, 14, 2}: {
 		Date: Date{2020, 4, 8},
 
@@ -457,20 +458,41 @@
 	},
 }
 
-// Version represents the version of a Go release.
-type Version struct {
-	X int // 1 or higher.
-	Y int // 0 or higher.
-	Z int // 0 or higher.
+// GoVer represents a Go release version.
+//
+// In contrast to Semantic Versioning 2.0.0,
+// trailing zero components are omitted,
+// a version like Go 1.14 is considered a major Go release,
+// a version like Go 1.14.1 is considered a minor Go release.
+//
+// See proposal golang.org/issue/32450 for background, details,
+// and a discussion of the costs involved in making a change.
+type GoVer struct {
+	X int // X is the 1st component of a Go X.Y.Z version. It must be 1 or higher.
+	Y int // Y is the 2nd component of a Go X.Y.Z version. It must be 0 or higher.
+	Z int // Z is the 3rd component of a Go X.Y.Z version. It must be 0 or higher.
+}
+
+// String returns the Go release version string,
+// like "1.14", "1.14.1", "1.14.2", and so on.
+func (v GoVer) String() string {
+	switch {
+	case v.Z != 0:
+		return fmt.Sprintf("%d.%d.%d", v.X, v.Y, v.Z)
+	case v.Y != 0:
+		return fmt.Sprintf("%d.%d", v.X, v.Y)
+	default:
+		return fmt.Sprintf("%d", v.X)
+	}
 }
 
 // IsMajor reports whether version v is considered to be a major Go release.
 // For example, Go 1.14 and 1.13 are major Go releases.
-func (v Version) IsMajor() bool { return v.Z == 0 }
+func (v GoVer) IsMajor() bool { return v.Z == 0 }
 
 // IsMinor reports whether version v is considered to be a minor Go release.
 // For example, Go 1.14.1 and 1.13.9 are minor Go releases.
-func (v Version) IsMinor() bool { return v.Z != 0 }
+func (v GoVer) IsMinor() bool { return v.Z != 0 }
 
 // Date represents the date (year, month, day) of a Go release.
 //