Golang インターフェースのベストプラクティス

参照型: ポインター、スライス、マップ、パイプ、インターフェイスなどはすべて参照型であり、関数パラメーターとして使用される場合の変更は元のデータに影響します。

ヒーロー構造スライスのソートを実装します: 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]
}

上記の方法は、高品質のコードを実現し、他の人が使用できるようにいくつかのインターフェイスをオープンし、同時にコアのコードをコアの人々に任せて書くのに役立ちます。

リリースされたパーツを他の人に公開し、インターフェイスを提供します。次の方法を使用すると、どのような基準に従って並べ替えるべきかがわかります。手放せるものは手放し、手放せないものは中に入れてください。

おすすめ

転載: blog.csdn.net/qq_34556414/article/details/133803514