接口的定义
package main
import "fmt"
// 接口的定义
type Duck interface {
//接口里面都是方法的定义
Gaga()
Walk()
Swimming()
}
type psDuck struct {
legs int
}
func (d psDuck) Gaga() {
fmt.Println("嘎嘎~")
}
func (d psDuck) Walk() {
fmt.Println("走路")
}
func (d psDuck) Swimming() {
fmt.Println("游泳")
}
func main() {
var d Duck = &psDuck{}
d.Walk()
}
Duck中都是方法的声明,可以让任何结构体与之绑定,并实现接口中的所有方法。但是需要注意的是接口中的方法要不全部实现,要不就不能绑定结构体
这个例子是一个结构体对应实现了一个interface中的方法,还可以一个结构体实现多个interface或者多个结构体实现一个interface中方法,这些都是很常见的。可以看如下代码,是两个接口绑定一个结构体的例子
package main
import "fmt"
type MyWriter interface {
write(s string) error
}
type MyCloser interface {
closer() error
}
type MyWriteAndCloser struct {
}
func (receiver MyWriteAndCloser) write(s string) error {
fmt.Println("write")
return nil
}
func (receiver MyWriteAndCloser) closer() error {
fmt.Println("closer")
return nil
}
func main() {
var myWrite MyWriter = &MyWriteAndCloser{}
myWrite.write("asd")
var myClose MyCloser = &MyWriteAndCloser{}
myClose.closer()
}
断言
package main
import (
"fmt"
"strings"
)
func add(a, b interface{}) interface{} {
switch a.(type) {
case int:
ai, _ := a.(int)
bi, _ := b.(int)
return ai + bi
case uint32:
ai, _ := a.(uint32)
bi, _ := b.(uint32)
return ai + bi
case string:
ai, _ := a.(string)
bi, _ := b.(string)
return ai + bi
default:
panic("not support type")
}
}
func main() {
a := 1
b := 2
fmt.Println(add(a, b))
a1 := "zhang "
b1 := "bo"
fmt.Println(add(a1, b1))
tempInterface := add(a1, b1)
str, _ := tempInterface.(string)
fmt.Println(strings.Split(str, " "))
}
不定参数
package main
import "fmt"
func print1(datas ...interface{}) {
for _, value := range datas {
fmt.Println(value)
}
}
func main() {
data := []interface{}{
"zhangbo", 18, "aksj", 1,
}
print1(data...)
}