成都网站制作维护,aso应用商店优化原因,wordpress 防cc,深圳宝安快餐服务200便宜面向对象Golang接口的定义go中类空接口空接口作为函数的参数切片实现空接口map的值实现空接口类型断言值接收者和指针接收者值接收者指针接收者接口嵌套Golang接口的定义
接口interface是一种抽象的类型。接口定义了一个对象的行为规范#xff0c;只定义规范不实现#xff0…
面向对象Golang接口的定义go中类空接口空接口作为函数的参数切片实现空接口map的值实现空接口类型断言值接收者和指针接收者值接收者指针接收者接口嵌套Golang接口的定义
接口interface是一种抽象的类型。接口定义了一个对象的行为规范只定义规范不实现由具体的对象来实现规范的细节。一个对象只要全部实现了接口中的方法那么就实现了这个接口。 看一个接口示例
package mainimport fmt// 1.接口时一个规范
type Usber interface {start()stop()
}// 2.如果接口里面有方法的话必须要通过结构体或者通过自定义类型实现这个接口
type Phone struct {Name string
}// 3.手机要实现usb借口的话必须实现usb接口中所有方法
func (p Phone) start() {fmt.Println(p.Name, 启动)
}
func (p Phone) stop() {fmt.Println(p.Name, 关机)
}func main() {p : Phone{Name: 小米手机}var p1 Usber // 接口就是一个数据类型p1 p // 表示手机实现Usb接口p1.start()p1.stop()
}
/*
小米手机 启动
小米手机 关机
*/go中类
没有类的概念也不支持类的继承等面向对象的概念。通过结构体内嵌配合接口比面向对象具有更高的扩展性和灵活性。
空接口
golang中空接口也可以直接当做类型使用泛型概念接口可以不定义任何方法没有定义任何方法的接口就是空接口空接口表示没有约束空接口可以表示任意数据类型
空接口作为函数的参数
package mainimport fmt// 空接口作为函数的参数
func show(a interface{}) {fmt.Printf(值%v 类型:%T\n, a, a)
}func main() {show(20) // 值20 类型:intshow(你好) // 值你好 类型:stringSlice : []int{1, 2, 3, 4}show(Slice) // 值你好 类型:string
}切片实现空接口
package mainimport fmtfunc main() {var Slice []interface{}{张三, 20, true, 20.2}fmt.Println(Slice) // [张三 20 true 20.2]}map的值实现空接口
package mainimport fmtfunc main() {// 空接口作为 map 值var studentInfo make(map[string]interface{})studentInfo[name] 张三studentInfo[age] 10studentInfo[married] falsefmt.Println(studentInfo) // map[age:10 married:false name:张三]
}类型断言
一个接口的值是由一个具体类型和具体类型的值两部分组成的。这两部分分别称为接口的动态类型和动态值。如果想要判断空接口中值的类型那么可以使用类型断言。语法格式x.(T)x:表示类型为interfact{}的变量T:表示断言x可能是的类型
package mainimport fmtfunc main() {var x interface{}x hello golangv, ok : x.(string)if ok {fmt.Println(v)} else {fmt.Println(非字符串类型)}
}
值接收者和指针接收者
值接收者
package mainimport fmttype Mover interface {move()
}type Dog struct {
}// 值接收者实现接口
func (d Dog) move() {fmt.Println(狗会动)
}func main() {var x Movervar wangcai Dog{} // 旺财是值类型x wangcai // x可以接收Dog类型var fugui Dog{} // 富贵是指针类型x fugui // x可以接收*Dog类型x.move()
}/*
用值接收者实现接口后不管是Dog结构体还是结构体指针*Dog类型的变量都可以赋值给该接口变量。
因为Go中有对指针类型变量求值的语法糖Dog指针fugui内部会自动求值*fugui。
*/指针接收者
package mainimport fmttype Mover interface {move()
}type Dog struct {
}// 指针接收者实现接口
func (d *Dog) move() {fmt.Println(狗会动)
}func main() {var x Movervar wangcai Dog{} // 旺财是值类型x wangcai // x不可以接收Dog类型var fugui Dog{} // 富贵是指针类型x fugui // x可以接收*Dog类型x.move()
}
/*
Move接口的接收者是指针类型所以不能给x传入Dog类型的wangcai因此x只能存储*Dog类型的值。
*/接口嵌套
package mainimport fmttype Sayer interface {say()
}type Mover interface {move()
}// 接口嵌套
type animal interface {SayerMover
}type cat struct {name string
}func (c cat) say() {fmt.Println(喵喵喵)
}func (c cat) move() {fmt.Println(猫动了)
}func main() {var x animalx cat{name: 大橘}x.move()x.say()
}