参照型: ポインター、スライス、マップ、パイプ、インターフェイスなどはすべて参照型であり、関数パラメーターとして使用される場合の変更は元のデータに影響します。
ヒーロー構造スライスのソートを実装します: sort.Sort (データ インターフェイス)
インターフェースには実装できるメソッドが 3 つありますが、実際、システムが提供するメソッドを呼び出して構造スライスをソートしたい場合は、インターフェースの 3 つのメソッドを実装する必要があります。
実際、インターフェースで提供されるソートメソッドは、sort 関数で使用されます。(実際、構造スライス タイプはそのインターフェイスの 3 つのメソッドを実装しているため、sort メソッドを呼び出して構造スライスの並べ替えを完了できます)
複数の構造体の変数を格納できるのは、構造体のスライス タイプのみです。
ソフトウェアパッケージ: sort func Sort(データインターフェース)
package main
import (
"fmt"
"math/rand"
"sort"
)
// Hero 声明hero结构体
type Hero struct {
Name string
Age int
}
// HeroSlice 声明hero结构体切片类型
type HeroSlice []Hero
// Len 实现Interface接口,将下面的三个方法都实现了。那么就可以调用Sort包里面的Sort方法了
func (hs HeroSlice) Len() int {
return len(hs)
}
// Less less这个方法就是决定你使用什么标准进行排序
// 按照hero的年龄从小到大排序
func (hs HeroSlice) Less(i, j int) bool {
return hs[i].Age < hs[j].Age
}
func (hs HeroSlice) Swap(i, j int) {
temp := hs[i]
hs[i] = hs[j]
hs[j] = temp
}
func main() {
var heroes HeroSlice
for i := 0; i < 10; i++ {
hero := Hero{
Name: fmt.Sprintf("hero~%d", i),
Age: rand.Intn(100),
}
heroes = append(heroes, hero)
}
for _, v := range heroes {
fmt.Printf("%v", v)
}
//调用sort包里面的sort方法,之所以将切片对应的类型放进去,是因为该类型实现了这三个方法
sort.Sort(heroes)
fmt.Printf("\n排序后的结果..............\n")
for _, v := range heroes {
fmt.Printf("%v", v)
}
}
{hero~0 99}{hero~1 81}{hero~2 46}{hero~3 33}{hero~4 10}{hero~5 72}{hero~6 43}{hero~7 20}{hero~8 43}{hero~9 18}
排序后的结果..............
{hero~4 10}{hero~9 18}{hero~7 20}{hero~3 33}{hero~6 43}{hero~8 43}{hero~2 46}{hero~5 72}{hero~1 81}{hero~0 99}
年齢ではなく名前で並べ替えたい場合は、次のように変更します。
func (hs HeroSlice) Less(i, j int) bool {
return hs[i].Name < hs[j].Name
}
このインターフェースの素晴らしい使い方は、上記のメソッドを実装し、後は Sort パッケージの Sort メソッドに任せることですが、これら 3 つのメソッドの呼び出し方法については、特に気にする必要はありません。
実際、このメソッドはインターフェイスを開くのに役立ちます。インターフェイスを実装すると、フィールドの並べ替えが自動的に完了します。最後に、代入ステートメントを変更してより簡潔にします。
func (hs HeroSlice) Swap(i, j int) {
hs[i], hs[j] = hs[j], hs[i]
}
上記の方法は、高品質のコードを実現し、他の人が使用できるようにいくつかのインターフェイスをオープンし、同時にコアのコードをコアの人々に任せて書くのに役立ちます。
リリースされたパーツを他の人に公開し、インターフェイスを提供します。次の方法を使用すると、どのような基準に従って並べ替えるべきかがわかります。手放せるものは手放し、手放せないものは中に入れてください。