公众号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) } }