1. 通过Implements方法

1.1 方法定义

ImplementsType
type Type interface {
	...
	// Implements reports whether the type implements the interface type u.
	Implements(u Type) bool
	...
}

1.2 实践

doganimaltrue
package main

import (
	"fmt"
	"reflect"
)

type dog struct {
}
type animal interface {
	speak()
}

func (a *dog) speak() {
	fmt.Println("wang wang wang!")
}

func main() {
	typ_dog := reflect.TypeOf(&dog{})
	typ_animal := reflect.TypeOf((*animal)(nil)).Elem()
	fmt.Println(typ_dog.Implements(typ_animal))
}

2. 通过赋值/传参的方式

doganimal
package main

import (
	"fmt"
)

type dog struct {
}
type animal interface {
	speak()
}

func (a *dog) speak() {
	fmt.Println("wang wang wang!")
}

func test(a animal) {
	fmt.Println("success")
}

func main() {
	test(&dog{})
}
doganimalmain
var _ animal = (*dog)(nil)var _ animal = &dog{}

3. 通过断言的方式

接口.(类型)
package main

import (
	"fmt"
)

type dog struct {
}
type animal interface {
	speak()
}

func (a *dog) speak() {
	fmt.Println("wang wang wang!")
}

func test(a animal) {
	if _, ok := a.(*dog); ok {
		fmt.Println("success")
	}
}

func main() {
	test(&dog{})
}

下图是没有实现接口时的报错

ps: 类似的断言方法还有(下面一串代码a的值为nil,ok为false)

func main() {
	var a animal
	if _, ok := a.(*dog); ok {
		fmt.Println(ok)
	}
}
if _, ok := 接口.(类型)