バージョン

version, SemVer

blang/semver

semVerを取り扱う人気のパッケージ。
X.Y.Z 形式でないものを semver.Make に食わせるとエラーになって 0.0.0 になってしまう。

Example:

raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2"}
vs := make([]semver.Version, len(raw))
for i, r := range raw {
	v, err := semver.Make(r)
	if err != nil {
		fmt.Printf("Error parsing version: %s. %v\n", r, err)
	}

	vs[i] = v
}

semver.Sort(vs)
fmt.Printf("sorted: %v\n", vs)
/*
Error parsing version: 1.0. No Major.Minor.Patch elements found
Error parsing version: 1.3. No Major.Minor.Patch elements found
Error parsing version: 2. No Major.Minor.Patch elements found
sorted: [0.0.0 0.0.0 0.0.0 0.4.2 1.2.3]
*/

https://play.golang.org/p/OZVwXRRnl4s

hashicorp/go-version

SemVer以外も想定するならこちらを使うのがよさそう。

Tips:

  • Version#.Original で元のバージョンを取り出せるようだ

バージョンの比較

Example:

var result bool
v := version.NewVersion("1.0")
result = v.Equal(cur)
result = v.GreaterThan(cur)
result = v.GreaterThanOrEqual(cur)
result = v.LessThan(cur)
result = v.LessThanOrEqual(cur)

var ret int
ret = v.Compare(cur)
// v < cur => -1
// v = cur =>  0
// v > cur =>  1

バージョンのソート

Example:

raw := []string{"1.1", "0.7.1", "1.4-beta", "1.4", "2"}
vs := make([]*version.Version, len(raw))
for i, r := range raw {
	v, err := version.NewVersion(r)
	if err != nil {
		fmt.Printf("Error parsing version: %s. %v\n", r, err)
	}

	vs[i] = v
}

sort.Sort(version.Collection(vs))
fmt.Printf("sorted: %v\n", vs)
//=> sorted: [0.7.1 1.1.0 1.4.0-beta 1.4.0 2.0.0]

https://play.golang.org/p/B_OBt8NeImn

Masterminds/semver

blang/semverと違い、1桁や2桁のバージョンも解釈できる。
hashicorp/go-versionとほぼ一緒で、インタフェースもよく似ている。

Example:

raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",}
vs := make([]*semver.Version, len(raw))
for i, r := range raw {
	v, err := semver.NewVersion(r)
	if err != nil {
		t.Errorf("Error parsing version: %s", err)
	}

	vs[i] = v
}

sort.Sort(semver.Collection(vs))
//=> sorted: [0.4.2 1.0.0 1.2.3 1.3.0 2.0.0]

https://play.golang.org/p/y6ABmgtJ9Yf

Tips:

  • Version#.Original で元のバージョンを取り出せるようだ