package main
import "fmt"
type st01 struct {
int
}
func (s st01) p(str string) string {
fmt.Println(str)
return str
}
func (s st01) i(i int) int {
fmt.Println(i)
return i
}
func main() {
type if01 interface {
p(s string) string
}
var st01 = interface{}(st01{})
//这里是具体的类型转成了空接口,任何对象都实现了空接口,这个是合法的,此时st01的类型是interface{},但是他的值是st01结构,具有一定的方法,可以断言为具体的接口类型,只有断言成具体的了接口类型才可以使用对对应类型的方法,因为当前类型interface{}空接口不具有p方法
if st02, ok := st01.(if01); ok { //定义个有p方法的接口,然后如果断言成功,说明st01拥有p方法,可以安全的使用
st02.p("可以安全的使用st01的p方法~")
}
}
type if02 interface {
p(s string) string
i(i int) int
}
type if03 interface {
p(s string) string
i(i int) int
b(i bool) bool
}
可以根据x断言的类型,判断x满足的接口,类调用不同类型的方法
package fmt
func formatOneValue(x interface{}) string {
if err, ok := x.(error); ok {
return err.Error()
}
if str, ok := x.(Stringer); ok {
return str.String()
}
// ...all other types...
}