//接口是一种类型,它规定了变量有哪些方法
//在编程中会遇到以下场景:
//我不关心一个变量是什么类型,我只关心能调用它的什么方法
//接口变量的存储分为两部分:类型和值
// type 接口名 interface{
// 方法名1(参数1,参数2...)(返回值1,返回值2)
// 方法名2(参数1,参数2...)(返回值1,返回值2)
// ...
// }
type speaker interface {
speak() //只要实现了speak方法的对象都是speaker类型
}
type cat struct{}
type dog struct{}
type person struct{}
func (c cat) speak() {
fmt.Println("喵喵喵~")
}
func (d dog) speak() {
fmt.Println("汪汪汪~")
}
func (p person) speak() {
fmt.Println("哈哈哈~")
}
func da(x speaker) {
x.speak()
}
func main() {
var c1 cat
var d1 dog
var p1 person
da(c1)
da(d1)
da(p1)
var s speaker //声明一个接口类型
s = c1
s.speak()
fmt.Printf("%T\n", s) // s的类型为cat类型
}
//使用值接收者实现接口与使用指针接收者实现接口的区别
//使用值接收者实现接口,结构体类型和结构体指针类型的变量都能存
//指针接收者实现接口只能存结构体指针类型的变量
type animal interface {
move()
eat(string)
}
type cat struct {
name string
feat int8
}
//使用指针接收者实现所有接口的所有方法
func (c *cat) move() {
fmt.Println("走猫步...")
}
func (c *cat) eat(food string) {
fmt.Printf("猫吃%s...\n", food)
}
func main() {
var a1 animal
c1 := cat{"tom", 4}
c2 := &cat{"加菲", 4}
a1 = &c1
fmt.Println(a1)
a1 = c2
fmt.Println(a1)
}
//接口嵌套
type animal interface{
mover
eater
}//就相当于move()和eat(string)
type mover interface{
move()
}
type eater interface{
eat(string)
}
//空接口
interface{}//没有必要起名字
//interface:关键字
//interface{}:空接口类型
func show(a interface{}){
fmt.Printf("type:%T value:%v\n",a,a)
}
func main(){
var m1 map[string]interface{}
m1 = make(map[string]interface{},16)
m1["name"]="周林"
m1["age"] = 9000
m1["merried"]=true
m1["hobby"]=[...]string{"唱","跳","rap"}
fmt.Println(m1)
show(false)
show(nil)
show(m1)
}
//类型断言
//x.(T)该语法返回两个参数,第一个参数是x转化为T类型后的变量,第二个值是一个布尔值,若为true则表示断言成功,为false则表示断言失败
func assign(a interface{}) {
fmt.Printf("%T\n", a)
str, ok := a.(string)
if !ok {
fmt.Println("猜错了")
} else {
fmt.Println("传来的是一个字符串", str)
}
}
func assign2(a interface{}) {
fmt.Printf("%T\n", a)
switch t := a.(type) { //switch a.(type)比较的是类型而不是具体的值
case string:
fmt.Println("是一个字符串", t)
case int:
fmt.Println("是一个int:", t)
case bool:
fmt.Println("是一个bool:", t)
}
}
func main() {
assign(100)
assign2("zyj")
}
//if v,ok:=a.(int8);!ok{
// fmt.Println("猜对了,a是int8",v)
//}
golang入门笔记—接口
于 2022-04-03 17:37:03 首次发布