golang:对struct排序的方法

golang对struct排序的方法

以下代码示例,通过对Student 结构体的age字段进行从小到大和从大到小排序

方法一

使用 sort.Slice() 进行排序

package main

import (
	"fmt"
	"sort"
)

type Student struct {
	name string
	age  int
}

func main() {
	students := []Student{
		{name: "tom", age: 18},
		{name: "jack", age: 20},
		{name: "steve", age: 19},
	}

	// 1、排序前
	fmt.Println(students)
	// [{tom 18} {jack 20} {steve 19}]


	// 2、由小到大排序
	sort.Slice(students, func(i, j int) bool {
		return students[i].age < students[j].age
	})
	fmt.Println(students)
	// [{tom 18} {steve 19} {jack 20}]


	// 3、由大到小排序
	sort.Slice(students, func(i, j int) bool {
		return students[j].age < students[i].age
	})
	fmt.Println(students)
	// [{jack 20} {steve 19} {tom 18}]
}

方法二

使用sort.Sort() 进行排序

使用sort.Sort() 方法需要重写Len()、Swap()、Less() 这三个方法

package main

import (
	"fmt"
	"sort"
)

type Student struct {
	name string
	age  int
}

type Students []Student

func (a Students) Len() int {
	return len(a)
}

func (a Students) Swap(i, j int) {
	a[i], a[j] = a[j], a[i]
}

func (a Students) Less(i, j int) bool {
	return a[i].age < a[j].age
}

func main() {
	students := []Student{
		{name: "tom", age: 18},
		{name: "jack", age: 20},
		{name: "steve", age: 19},
	}

	// 1、排序前
	fmt.Println(students)
	// [{tom 18} {jack 20} {steve 19}]


	// 2、由小到大排序
	sort.Sort(Students(students))

	fmt.Println(students)
	// [{tom 18} {steve 19} {jack 20}]


	// 3、由大到小 排序
	sort.Sort(sort.Reverse(Students(students)))
	fmt.Println(students)
	// [{jack 20} {steve 19} {tom 18}]

}

参考
golang对struct排序的方法

### Golang 中 `struct` 类型的使用方法和特性 #### 定义结构体 在 Go 语言中,`struct` 是一种由多个不同数据类型成员组成的数据类型。通过定义结构体可以创建自定义复合类型。 ```go type Person struct { Name string Age int } ``` 此段代码展示了如何声明一个新的名为 `Person` 的结构体,它有两个字段:一个是字符串类型的 `Name` 和一个整数类型的 `Age`[^1]。 #### 创建结构体实例 可以通过多种方式来初始化结构体变量: ```go // 方法一:直接赋值 var p1 Person p1.Name = "Alice" p1.Age = 30 // 方法二:使用字面量语法 p2 := Person{ Name: "Bob", Age: 25, } // 方法三:指定字段名顺序无关紧要 p3 := &Person{ Age: 40, Name: "Charlie", } ``` 这里介绍了三种不同的创建结构体实例的方法,每种都有其适用场景。 #### 嵌套结构体 Go 支持嵌入其他结构体内作为成员的方式构建更复杂的结构。 ```go type Address struct { Street string City string } type Employee struct { ID int Info Person // 嵌入另一个结构体 Location Address // 同样也可以是自定义类型 } ``` 上述例子说明了怎样在一个更大的结构里包含较小的部分,从而形成层次化的数据模型。 #### 结构体数组排序 对于含有特定字段的结构体切片(即动态长度的数组),可利用标准库中的 `sort.Slice()` 函数对其进行排序操作。 ```go import ( "fmt" "sort" ) func main() { people := []Person{ {"Eve", 28}, {"Dave", 22}, {"Carol", 35}, } sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age }) fmt.Println("Sorted by age:", people) } ``` 这段程序片段实现了基于年龄升序排列的一组人员记录列表[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值