GO语言结构体排序

liutengfeigo 2013-12-18 04:15:03
跟C/C++的感觉差不多.
对应的切片实现sort的这3个接口Len, Less, Swap.就好了.


import "sort"

type user struct {
id int
name string
}

type users []user

func (u users) Len() int {
return len(u)
}

func (u users) Less(i, j int) bool {
if u[i].id == u[j].id {
return u[i].name < u[j].name
}
return u[i].id < u[j].id//sort by id if id is the same sort by name...
}

func (u users) Swap(i ,j int) {
u[i].id, u[j].id = u[j].id, u[i].id
u[i].name, u[j].name = u[j].name, u[i].name
}


uu := []user{{1,"aa"}, {20,"bb"}, {3, "cc"}, {3, "cb"}}
fmt.Println(uu)
sort.Sort(users(uu))
fmt.Println(uu)


...全文
700 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
飃颻 2014-05-12
  • 打赏
  • 举报
回复
ByAge做为sort接口的类型,必须依次实现Len,Less和Swap方法,否则运行时报sort接口函数参数错误,而Person为自定义的待排序结构体。 一、func (p Person) String() string { return fmt.Sprintf("%s: %d\n", p.Name, p.Age) p Person无指针类型的运行结果: >go run mysort.go [Bob: 31 John: 42 Michael: 17 Jenny: 26 ] [Michael: 17 Jenny: 26 Bob: 31 John: 42 ] 二、func (p *Person) String() string { return fmt.Sprintf("%s: %d\n", p.Name, p.Age) p *Person指针类型的运行结果: >go run mysort.go [{Bob 31} {John 42} {Michael 17} {Jenny 26}] [{Michael 17} {Jenny 26} {Bob 31} {John 42}]
青空飞羽 2014-05-09
  • 打赏
  • 举报
回复
成员函数的写法是不是有问题啊? 该这样? func (p *Person) String() string { return fmt.Sprintf("%s: %d", p.Name, p.Age) }
ForNoReason 2014-05-07
  • 打赏
  • 举报
回复
go 的结构体数组排序还是相当原始的, 怀念C#的排序.
十一文 2014-01-22
  • 打赏
  • 举报
回复
引用 5 楼 u011745918 的回复:
太强大了,爱死GO
欢迎多来 发表资源
oracleri 2014-01-20
  • 打赏
  • 举报
回复
太强大了,爱死GO
末日哥 2013-12-23
  • 打赏
  • 举报
回复
学习
十一文 2013-12-18
  • 打赏
  • 举报
回复
强烈支持 楼主
liutengfeigo 2013-12-18
  • 打赏
  • 举报
回复
自己连swap都写不好了.
liutengfeigo 2013-12-18
  • 打赏
  • 举报
回复

package main

import (
	"fmt"
	"sort"
)

type Person struct {
	Name string
	Age  int
}

func (p Person) String() string {
	return fmt.Sprintf("%s: %d", p.Name, p.Age)
}

// ByAge implements sort.Interface for []Person based on
// the Age field.
type ByAge []Person

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }

func main() {
	people := []Person{
		{"Bob", 31},
		{"John", 42},
		{"Michael", 17},
		{"Jenny", 26},
	}

	fmt.Println(people)
	sort.Sort(ByAge(people))
	fmt.Println(people)

}
golang官方实例
内容概要:本文详细阐述了Go结构体内存对齐的原理及减少Padding的空间优化技巧。首先介绍了Go结构体的基础概念,包括定义、实例化、字段访问和嵌套。接着解释了内存对齐的原理,包括CPU按特定字节块读取内存以提高效率,不同数据类型的对齐系数,以及编译器为满足对齐要求插入Padding字节的原因。随后,文章深入分析了多种减少Padding的优化技巧,如字段重排序结构体拆分、使用`unsafe.Pointer`手动对齐及使用`//go:noinline`和`//go:nocheckptr`注解等,并通过具体案例展示了这些技巧的应用效果。此外,还进行了性能测试与对比,验证了优化后的结构体不仅节省内存,还提高了访问性能。最后,文章讨论了优化过程中的注意事项及最佳实践,并展望了未来的发展方向。 适合人群:具备一定Go语言基础,特别是对内存管理和性能优化感兴趣的开发者,以及工作1-3年的研发人员。 使用场景及目标:①理解Go结构体内存对齐机制,掌握减少Padding的优化方法;②应用于对内存和性能要求较高的场景,如大规模数据处理、嵌入式系统等;③通过优化结构体布局,减少内存占用,提高访问性能。 阅读建议:本文内容较为深入,建议读者先掌握Go结构体的基本概念,再逐步学习内存对齐原理和优化技巧。在实践中,应结合实际需求选择合适的优化方法,并定期进行性能测试以确保优化效果。同时,注意避免滥用`unsafe`包,保持代码的可读性和可维护性。

2,348

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • 俺叫西西弗斯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧