Лучшие практики интерфейса Golang

Типы ссылок: указатели, срезы, карты, каналы, интерфейсы и т. д. — все это ссылочные типы. Изменения при использовании в качестве параметров функции повлияют на исходные данные.

Реализовать сортировку фрагментов структуры Hero: sort.Sort (интерфейс данных)

В интерфейсе можно реализовать три метода. Фактически, если вы хотите вызвать методы, предоставляемые системой, для сортировки срезов структуры, вам необходимо реализовать три метода интерфейса.

Фактически метод сортировки, предусмотренный в интерфейсе, используется в функции сортировки. (Фактически, тип среза структуры реализует три метода этого интерфейса, поэтому вы можете вызвать метод sort для завершения сортировки срезов структуры)

Только тип среза структуры может хранить переменные нескольких структур.

Программный пакет: функция сортировки 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.Что касается вызова этих трех методов, вам не нужно об этом беспокоиться.

Фактически этот метод помогает открыть интерфейс.Если вы реализуете интерфейс, то сортировка автоматически заполнит поле. Наконец, измените оператор присваивания, чтобы сделать его более кратким.

func (hs HeroSlice) Swap(i, j int) {
	hs[i], hs[j] = hs[j], hs[i]
}

Вышеупомянутый метод помогает нам добиться высококачественного кода, открыть некоторые интерфейсы для использования другими и в то же время оставить основной код для написания основным людям.

Откройте выпущенные части другим и предоставьте интерфейсы. Воспользовавшись следующими методами, вы будете знать, по каким критериям производить сортировку. Если можешь отпустить, отпусти; если не можешь отпустить, положи это внутрь.

Supongo que te gusta

Origin blog.csdn.net/qq_34556414/article/details/133803514
Recomendado
Clasificación