标签:tar -- ring st3 而不是 color 行数据 height code
package main
import "fmt"
func main() {
/*
接口:interface
1. 在Go中,接口是一组方法签名。当类型为接口中的所有方法提供定义时,它被称为实现接口。它与OOP非常相似。
接口指定了类型应该具有的方法,类型决定了如何实现这些方法。
2. 它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。
3. 接口定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了该接口。
Go语言中,接口和实现类的关系,是非侵入式
//其他语言中,要显示的定义
class Mouse implements USB{}
1.当需要接口类型的对象时,可以使用任意实现类对象代替
2.接口对象不能访问实现类中的属性,赋值给一个变量(实例对象)是可以访问的
多态:一个事物的多种形态
go语言通过接口模拟多态
就一个接口的实现
1.看成实现本身的类型,能够访问实现类中的属性和方法
2.看成是对应的接口类型,那就只能够访问接口中的方法(其他语言中就是只能访问父类的方法)
接口的用法:
1.一个函数如果接受接口类型作为参数,那么实际上可以传入该接口的任意实现类型对象作为参数。
2.定义一个类型为接口类型,实际上可以赋值为任意实现类的对象
鸭子类型:针对动态类型语言来说的(Python),长得像鸭子,走起路来像鸭子,叫起来像鸭子,那么它就是鸭子
1. 是一种类型推断策略
2. 关注的是对象如何被使用,而不是对象本身的类型
3. Go不要求显示显示声明实现了那个接口,接口的实现只要实现了方法就可以,Go也支持鸭子模型
*/
//1.创建Mouse类型
m1 := Mouse{"罗技小红"}
fmt.Println(m1.name)
//2.创建FlashDisk
f1 := FlashDisk{"闪迪64G"}
fmt.Println(f1.name)
testInterface(m1) //参数是USB接口类型对象
testInterface(f1)
var usb USB
usb= f1
usb.start()
usb.end()
//fmt.Println(usb.name)
f1.deleteData()
//usb.de
var arr [3]USB
arr[0] = m1
arr[1] = f1
fmt.Println(arr)
}
//1.定义接口
type USB interface {
start() //USB设备开始工作
end() //USB设备结束工作
}
//2.实现类
type Mouse struct {
name string
}
type FlashDisk struct {
name string
}
func (m Mouse)start(){
fmt.Println(m.name,"鼠标,准备就绪,可以开始工作了,点点点。。")
}
func (m Mouse) end(){
fmt.Println(m.name,"结束工作,可以安全退出。。")
}
func (f FlashDisk)start(){
fmt.Println(f.name,"准备开始工作,可以进行数据的存储。。")
}
func (f FlashDisk)end(){
fmt.Println(f.name,"可以弹出。。")
}
func (f FlashDisk) deleteData(){
fmt.Println(f.name,"U盘删除数据。。")
}
//3.测试方法
func testInterface(usb USB){ //usb = m1 usb = f1
usb.start()
usb.end()
}


package main
import "fmt"
func main() {
/*
空接口(interface{})
不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值。
fmt包下的Print系列函数的参数就有空接口:
//接收可变参数,任意类型
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
*/
var a1 A = Cat{"花猫"}
var a2 A = Person{"王二狗",30}
var a3 A = "haha"
var a4 A = 100
fmt.Println(a1)
fmt.Println(a2)
fmt.Println(a3)
fmt.Println(a4)
test1(a1)
test1(a2)
test1(3.14)
test1("Ruby")
test2(a3)
test2(1000)
//map,key字符串,value任意类型
map1 := make(map[string]interface{})
map1["name"] = "李小花"
map1["age"] = 30
map1["friend"] = Person{"Jerry",18}
fmt.Println(map1)
//切片,存储任意类型的数据
slice1 := make([]interface{},0,10)
slice1 = append(slice1,a1,a2,a3,a4,100,"abc")
fmt.Println(slice1)
test3(slice1)
}
func test3(slice2 []interface{}){
for i:=0;i<len(slice2);i++{
fmt.Printf("第%d个数据:%v\n",i+1,slice2[i])
}
}
//接口A是空接口,理解为代表了任意类型
func test1(a A){ //这个空接口是有名字的
fmt.Println(a)
}
func test2(a interface{}){
fmt.Println("--->",a)
}
//空接口
type A interface {
}
type Cat struct {
color string
}
type Person struct {
name string
age int
}
标签:tar -- ring st3 而不是 color 行数据 height code
原文地址:https://www.cnblogs.com/yzg-14/p/12247544.html