golang中的接口和Sort方法的接口最佳实践

简介: golang中的接口和Sort方法的接口最佳实践

公众号merlinsea


  • 接口interface
  • 接口的关键字是interface
  • 定义接口的时候只是声明其中的方法,不能包含任何的变量
  • 当一个结构体实现了接口中所有的方法的时候,这个结构体就实现了这个接口,即可以用一个接口变量来接收这个结构体
  • interface是一种引用类型


package main
import (
   "fmt"
)
//声明/定义一个接口
type Usb interface {
   //声明了两个没有实现的方法
   Start()
   Stop()
}
//声明/定义一个接口
type Usb2 interface {
   //声明了两个没有实现的方法
   Start()
   Stop()
   Test()
}
type Phone struct {
}
//让Phone 实现 Usb接口的方法
// 这里是*Phone实现了Usb接口,而不是Phone类型,因此把*Phone类型交给Usb接口不能把把Phone类型交给Usb接口
func (p *Phone) Start() {
   fmt.Println("手机开始工作。。。")
}
func (p *Phone) Stop() {
   fmt.Println("手机停止工作。。。")
}
type Camera struct {
}
//让Camera 实现   Usb接口的方法
func (c Camera) Start() {
   fmt.Println("相机开始工作~~~。。。")
}
func (c Camera) Stop() {
   fmt.Println("相机停止工作。。。")
}
//计算机
type Computer struct {
}
//编写一个方法Working 方法,接收一个Usb接口类型变量
//只要是实现了 Usb接口 (所谓实现Usb接口,就是指实现了 Usb接口声明所有方法)
func (c Computer) Working(usb Usb) {
   //通过usb接口变量来调用Start和Stop方法
   usb.Start()
   usb.Stop()
}
func main() {
   //测试
   //先创建结构体变量
   computer := Computer{}
   phone := Phone{}
   camera := Camera{}
   //关键点
   computer.Working(&phone)
   computer.Working(camera)
}


  • 接口最佳实践——sort.Sort()方法
  • 对自定义切片类型的排序方法如下
  • 对自定义的切片类型用 type关键字声明一个别名
  • 对这个别名来实现sort接口中的方法,分别是Len(),Less(),Swap()方法
  • 在使用过程中虽然我们代码中是用别名来定义一个切片的类型,但是在使用过程中不管是append还是下标访问和没有声明别名之前是一样的
package main
import (
   "fmt"
   "math/rand"
   "sort"
)
//1.声明Hero结构体
type Hero struct {
   Name string
   Age  int
}
//2.声明一个Hero结构体切片类型
//为了方便对自定义切片进行排序,我们对切片声明了一个type别名,然后对这个别名来实现sort接口的方法
// 但在实际使用中该怎么使用切片还是怎么使用切片
type HeroSlice []Hero
//3.实现Interface 接口
func (hs HeroSlice) Len() int {
   return len(hs)
}
//Less方法就是决定你使用什么标准进行排序
//1. 按Hero的年龄从小到大排序!!
func (hs HeroSlice) Less(i, j int) bool {
   return hs[i].Age < hs[j].Age
   //修改成对Name排序
   //return hs[i].Name < hs[j].Name
}
func (hs HeroSlice) Swap(i, j int) {
   //交换
   // temp := hs[i]
   // hs[i] = hs[j]
   // hs[j] = temp
   //下面的一句话等价于三句话
   hs[i], hs[j] = hs[j], hs[i]
}
func main() {
   //先定义一个数组/切片
   var intSlice = []int{0, -1, 10, 7, 90}
   sort.Ints(intSlice)
   fmt.Println(intSlice)
   //测试看看我们是否可以对结构体切片进行排序
   //用别名来声明一个自定义切片,但在实际使用中该怎么使用还怎么使用
   var heroes HeroSlice
   for i := 0; i < 10; i++ {
      hero := Hero{
         Name: fmt.Sprintf("英雄|%d", rand.Intn(100)),
         Age:  rand.Intn(100),
      }
      //将 hero append到 heroes切片
      heroes = append(heroes, hero)
   }
   //看看排序前的顺序
   for _, v := range heroes {
      fmt.Println(v)
   }
   //调用sort.Sort
   sort.Sort(heroes)
   fmt.Println("-----------排序后------------")
   //看看排序后的顺序
   for _, v := range heroes {
      fmt.Println(v)
   }
}


相关文章
|
编译器 Go 开发者
Golang 语言怎么使用接口编程?
Golang 语言怎么使用接口编程?
65 0
|
2月前
|
Go
Golang语言基础之接口(interface)及类型断言
这篇文章是关于Go语言中接口(interface)及类型断言的详细教程,涵盖了接口的概念、定义、实现、使用注意事项以及类型断言的多种场景和方法。
37 4
|
3月前
|
存储 程序员 编译器
Golang 中的字符串:常见错误和最佳实践
Golang 中的字符串:常见错误和最佳实践
|
4月前
|
中间件 测试技术 Go
Golang中的错误处理最佳实践
【7月更文挑战第10天】在Golang中,错误处理是核心且重要的。最佳实践包括:定义明确的错误类型,使用错误链(如`%w`包装错误),始终检查错误(避免忽略),谨慎使用`panic`和`recover`,利用多值返回处理错误,标准化错误处理逻辑,并确保测试错误处理代码。这些做法有助于构建健壮和可维护的程序。
|
6月前
|
JSON Go 数据格式
golang学习7,glang的web的restful接口结构体传参
golang学习7,glang的web的restful接口结构体传参
|
6月前
|
JSON Go 数据格式
golang学习6,glang的web的restful接口传参
golang学习6,glang的web的restful接口传参
|
6月前
|
安全 Go
Golang深入浅出之-接口(Interfaces)详解:抽象、实现与空接口
【4月更文挑战第22天】Go语言接口提供抽象能力,允许类型在不暴露实现细节的情况下遵循行为约定。接口定义了一组方法签名,类型实现这些方法即实现接口,无需显式声明。接口实现是隐式的,通过确保类型具有接口所需方法来实现。空接口`interface{}`接受所有类型,常用于处理任意类型值。然而,滥用空接口可能丧失类型安全性。理解接口、隐式实现和空接口的使用能帮助编写更健壮的代码。正确使用避免方法,如确保方法签名匹配、检查接口实现和谨慎处理空接口,是关键。
62 1
|
6月前
|
JSON Go 数据格式
golang学习5,glang的web的restful接口
golang学习5,glang的web的restful接口
|
6月前
|
Go
golang学习4,glang的web接口
golang学习4,glang的web接口
|
6月前
|
存储 缓存 Go
Golang底层原理剖析之类型系统,接口与类型断言
Golang底层原理剖析之类型系统,接口与类型断言
89 2