Interface
检测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)
}
}