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)
}

本文转载于(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/4MibjHUlqfFtc9gLTXNnmA

posted @   不背锅运维  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示