Go速成无压力【十四】:接口

一,接口

一个接口被定义为方法签名的集,一个接口类型的值可以放任何声明了那些方法的值

package main

import (
	"fmt"
)

type Adder interface {
	Add() int
}

type MyI int

func (f MyI) Add() int {
	return int(f + 20)
}

type Vertex struct {
	X, Y int
}

func (v *Vertex) Add() int {
	return v.X + v.Y
}

func main() {
	var a Adder
	f := MyI(10)
	v := Vertex{1, 2}
	a = f
	fmt.Println(a.Add())
	a = &v
	fmt.Println(a.Add())
}

运行结果为:

30
3

二,接口的简单声明

接口可以简单声明

package main

import "fmt"

type She interface {
	Like()
}

type T struct {
	favor1 string
	number int
}

func (t T) Like() {
	fmt.Println("She's favor is", t.favor1)
	fmt.Println("She's luck number is", t.number)
}

func main() {
	var she She = T{"Swimming", 8}
	she.Like()
}

运行结果为:

She's favor is Swimming
She's luck number is 8

三,接口的值

接口值可以是一个值和混合类型的元祖的,像(value, type)这样的

package main

import (
	"fmt"
	"math"
)

type I interface {
	Ask()
}

type T struct {
	S string
}

func (t *T) Ask() {
	fmt.Printf("What is her question : %s", t.S)
}

type F float64

func (f F) Ask() {
	fmt.Println(f)
}

func main() {
	var i I
	i = &T{"Do you what is this value of Pi ?"}
	result(i)
	i.Ask()

	i = F(math.Pi)
	result(i)
}

func result(i I) {
	fmt.Printf("\nthis Value is %v ; \nthis Type is %T \n", i, i)
}

运行结果为:

this Value is &{Do you what is this value of Pi ?} ;
this Type is *main.T
What is her question : Do you what is this value of Pi ?
this Value is 3.141592653589793 ;
this Type is main.F

四,空接口

没有指定任何类型方法的接口是空接口,如:interface{}
空接口可以接受任何类型的值

package main

import "fmt"

func main() {
	var i interface{}
	describe(i)

	i = 2020
	describe(i)

	i = "你好"
	describe(i)
}

func describe(i interface{}) {
	fmt.Printf("(%v, %T)\n", i, i)
}

运行结果为:

(<nil>, <nil>)
(2020, int)
(你好, string)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值