We can not directly use the sorting library Sort for sorting structs in Golang.
In order to sort a struct the underlying struct should implement a special interface called sort.Interface
This interface requires three methods
Len, Swap and Less
Let’s try to understand this using an example.
Define a struct
type EnvVar struct {
Name string
value string
}Here we have a struct struct named EnvVar with two fields Name and value
Next we have to implement the interface.
Implementing the interface
func (e EnvVar) Len() int {
return len(e)
}
func (e EnvVar) Less(i, j int) bool {
return e[i].Name < e[j].Name
}
func (e EnvVar) Swap(i, j int) {
e[i], e[j] = e[j],es[i]
}The first method returns the how many elements are there in our struct.
We are using the default golang len() function for this.
The second method helps us to determine which element in our struct comes first. Here we are doing a simple string comparision which will give us a lexicographic sort order of the elements.
The third method shuffles the element around.
Lets sort some data
func main() {
envs := EnvSort{
{Name: "MYSQL_ROOT_PASSWORD", value: "openshift"},
{Name: "MYSQL_DATABASE", value: "openshift"},
{Name: "MYSQL_PASSWORD", value: "openshift"},
{Name: "MYSQL_USER", value: "openshift"},
{Name: "DB_HOST", value: "openshift"},
{Name: "DB_DBID", value: "openshift"},
{Name: "DB_PASS", value: "openshift"},
{Name: "DB_PORT", value: "openshift"},
{Name: "DB_USER", value: "openshift"},
}
sort.Sort(envs)
for _, v := range envs {
fmt.Println(v.Name, v.value)
}
}Output
DB_DBID openshift
DB_HOST openshift
DB_PASS openshift
DB_PORT openshift
DB_USER openshift
MYSQL_DATABASE openshift
MYSQL_PASSWORD openshift
MYSQL_ROOT_PASSWORD openshift
MYSQL_USER openshiftThat’s how we can sort any struct in golang.
Full Code
package main
import (
"fmt"
"sort"
)
type EnvVar struct {
Name string
value string
}
type EnvSort []EnvVar
func (slice EnvSort) Len() int {
return len(slice)
}
func (slice EnvSort) Less(i, j int) bool {
return slice[i].Name < slice[j].Name
}
func (slice EnvSort) Swap(i, j int) {
slice[i], slice[j] = slice[j], slice[i]
}
func main() {
envs := EnvSort{
{Name: "MYSQL_ROOT_PASSWORD", value: "openshift"},
{Name: "MYSQL_DATABASE", value: "openshift"},
{Name: "MYSQL_PASSWORD", value: "openshift"},
{Name: "MYSQL_USER", value: "openshift"},
{Name: "DB_HOST", value: "openshift"},
{Name: "DB_DBID", value: "openshift"},
{Name: "DB_PASS", value: "openshift"},
{Name: "DB_PORT", value: "openshift"},
{Name: "DB_USER", value: "openshift"},
}
sort.Sort(envs)
for _, v := range envs {
fmt.Println(v.Name, v.value)
}
}