Go:一文玩转接口

简介: Go:一文玩转接口
  1. 接口的基本剖析
package main
import "fmt"
type Test interface {
 show()
}
type myString string
func (mys myString) show() {
 fmt.Println(mys)
}
func main() {
 var a myString = "tantianran"
 a.show()
}

输出:

tantianran

定义接口:上述代码中,定义了接口Test,该接口规定了有show()方法,而且,Test接口只有1个方法。

实现接口:接下来就是实现接口,在go中,任意类型只要实现了接口的所有方法(这里的Test接口只有1个方法),那么就实现了该接口(而且是隐式实现),刚提到任意类型,于是这里定义了一个类型为string的自定义类型myString,且由该自定义类型myString实现了show()方法,刚提到只要实现了接口的所有方法就实现了该接口,也就是说自定义的myString类型已经实现了Test接口。

使用接口:定义了类型为myString的变量a,且给它赋值了"tantianran",这时候,它就拥有了show方法。所以说,一个变量不管它是什么类型,只要实现了Test接口,就能调用它的show方法。

  1. 在上一个栗子的基础上,继续看看这个小栗子

刚提到任意类型只要实现了Test接口,就能调用它的show方法,来验证一下

package main
import "fmt"
type Test interface {
 show()
}
type myInts int16
func (myi myInts) show() {
 fmt.Println(myi)
}
func main() {
 var a myInts = 200
 a.show()
}

输出:

200

果然,自定义了一个int16类型的自定义类型myInts,它也用了show方法。

  1. 继续上一个例子,看看下面代码

定义个结构体类型的User试试

package main
import "fmt"
type Test interface {
 show()
}
type User struct {
 name string
 age  int
}
func (u User) show() {
 fmt.Println(u)
}
func main() {
 u := User{"tantianran", 18}
 u.show()
}

输出:

{tantianran 18}
  1. 来一个贴近生活的小栗子
package main
import "fmt"
// 支付接口
type Payment interface {
 Payment() float64
}
// 银行卡
type Bankcard struct {
 CardId     int64
 Moneytotal float64
}
// 结算
func settleAccount(b *Bankcard, p Payment) {
 fmt.Println("正在发生扣款...")
 amount := p.Payment()
 res := b.Moneytotal - amount
 b.Moneytotal = res
}
// 微信
type Weixin struct {
 AccountID string
 Type      string
}
func (w Weixin) Payment() float64 {
 return 65.78
}
// 支付宝
type Zhifubao struct {
 AccountID string
 Type      string
}
func (z Zhifubao) Payment() float64 {
 return 82.12
}
type PingDuoduo struct {
 Commodity string  //商品
 Price     float64 //价格
}
func main() {
 card := Bankcard{CardId: 2349342594759947742, Moneytotal: 1200.89}
 fmt.Println(card.Moneytotal)
 wx := Weixin{AccountID: "ttr", Type: "微信"}
 zfb := Zhifubao{AccountID: "ttr1", Type: "支付宝"}
 settleAccount(&card, wx)
 settleAccount(&card, zfb)
 fmt.Println(card.Moneytotal)
}
  1. 通过接口实现结构体排序

自定义的结构体只要实现了Len、Less、Swap方法,就可以交给标准库中的sort.Sort进行排序。

package main
import (
 "fmt"
 "math/rand"
 "sort"
)
type Hero struct {
 Name string
 Age  int
}
type HeroSlice []Hero
func (hs HeroSlice) Len() int {
 return len(hs)
}
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("host-%d", rand.Intn(100)),
   Age:  rand.Intn(100),
  }
  heroes = append(heroes, hero)
 }
 sort.Sort(heroes)
 for _, v := range heroes {
  fmt.Println(v)
 }
}
  1. 函数形参,类型是空接口时可以接收任意类型
package main
import "fmt"
func test(t interface{}) {
 fmt.Println(t)
}
type User struct {
 name string
}
func main() {
 a := 1
 b := "hello"
 c := map[string]int{
  "age": 18,
 }
 u := User{name: "ttr"}
 z := []interface{}{"hello", 100, 89.78, c, a, b}
 test(a)
 test(b)
 test(c)
 test(u)
 test(z)
}
  1. 变量的类型为空接口时,也可以接收任意类型的值
package main
import "fmt"
type myinterface interface{}
func main() {
 var a myinterface = 10
 fmt.Println(a)
 var b myinterface = 89.78
 fmt.Println(b)
 numarr := []int{1, 2, 3, 4, 5}
 var c myinterface = numarr
 fmt.Println(c)
 user := map[string]string{
  "name": "ttr",
  "addr": "gz",
 }
 var d myinterface = user
 fmt.Println(d)
}
相关文章
|
2月前
|
自然语言处理 Go 索引
Go语言学习8-接口类型
【4月更文挑战第1天】本篇 Huazie 向大家介绍 Go 语言中的接口类型
26 2
Go语言学习8-接口类型
|
2月前
|
设计模式 存储 监控
《Go 简易速速上手小册》第4章:接口与抽象(2024 最新版)(上)
《Go 简易速速上手小册》第4章:接口与抽象(2024 最新版)
54 1
|
2月前
|
Go
|
2月前
|
存储 设计模式 Cloud Native
云原生系列Go语言篇-类型、方法和接口 Part 1
通过前面章节的学习,我们知道Go是一种静态类型语言,包含有内置类型和用户定义类型。和大部分现代编程语言一样,Go允许我们对类型关联方法。它也具备类型抽象,可以编写没有显式实现的方法。
57 0
|
20天前
|
Go 数据安全/隐私保护
go 基于gin编写encode、decode、base64加密接口
go 基于gin编写encode、decode、base64加密接口
15 2
|
2月前
|
程序员 Go
|
2月前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
15天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
27天前
|
Go
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)
掌握Go语言:Go语言接口精解,实现多态性与灵活性的利器(31)
|
1月前
|
存储 Go iOS开发
Go 语言接口
Go 语言接口
16 2