检测struct类型是否实现了某个接口

package main

import "fmt"

type Resource interface {
	GetName() string
	Restart()
}

type Pod struct {
	Name          string
	RestartNumber int
}

func (p Pod) GetName() string {
	return p.Name
}

func (p *Pod) Restart() {
	p.RestartNumber += 1
}

func main() {
    // 会出现如下的错误: cannot use Pod literal (type Pod) as type Resource in assignment:
	Pod does not implement Resource (Restart method has pointer receiver)
	var _ Resource = Pod{}

}

因此如果我们想要检测一个类型是否实现了指定的接口,可以通过var _ io.Writer = &myWriter{}的方式来检测。

类型转换和断言的区别

类型转换的语法:

<结果类型> := <目标类型>(表达式)

示例:

package main

import "fmt"

func main() {
	var i int = 1
	f := float64(i)
	fmt.Println(i, f)
}

断言的语法:

<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言
<目标类型的值> := <表达式>.( 目标类型 )  //非安全类型断言
使用`switch...case...`的方式

示例:

package main

import "fmt"

type Resource interface {
	GetName() string
	Restart()
}

type Pod struct {
	Name          string
	RestartNumber int
}

func (p Pod) GetName() string {
	return p.Name
}

func (p *Pod) Restart() {
	p.RestartNumber += 1
}

func main() {
	var i interface{}
	i = &Pod{}
    // 如果类型错误,这里会直接panic
	// p := i.(Pod)
	// fmt.Println(p)
    // 使用下面的方式判断,即使出错,也不会panic
    p, ok := i.(Pod)
	if ok {
		fmt.Println(p)
	}
}